Fleet tools: 8s probe cap + post-update refresh retries (updates now reflect)
ci / gates (push) Successful in 6s
ci / rust (push) Failing after 7s
ci / frontend (push) Successful in 24s
ci / e2e (push) Has been skipped

After 'claude update' replaces the binary, the daemon's re-probe ran the fresh
binary which macOS Gatekeeper re-verifies (>2s) — the 2s probe cap missed the new
version, so the UI didn't refresh (update worked but looked stale). Bump the cap to
8s; frontend polls the tools endpoint a few times post-update to catch the re-probe.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
This commit is contained in:
Omar Sobh
2026-06-27 06:55:25 -07:00
co-authored by Claude Opus 4.8
parent ed339c2121
commit b82a71d4ea
2 changed files with 7 additions and 3 deletions
+4 -1
View File
@@ -249,7 +249,10 @@ fn tool_version(bin: &std::path::Path) -> Option<String> {
}); });
let _ = tx.send(text); let _ = tx.send(text);
}); });
let text = rx.recv_timeout(Duration::from_secs(2)).ok().flatten()?; // 8s, not 2s: right after an update the binary is freshly replaced, and macOS
// Gatekeeper re-verifies an unsigned binary on first exec (several seconds) — a
// tight cap would miss the new version on the post-update re-probe.
let text = rx.recv_timeout(Duration::from_secs(8)).ok().flatten()?;
extract_semver(&text) extract_semver(&text)
} }
@@ -139,8 +139,9 @@ function NodeTools({ nodeId, online }: { nodeId: string; online: boolean }) {
.then((r) => r.json()) .then((r) => r.json())
.then((d: { ok?: boolean; output?: string }) => { .then((d: { ok?: boolean; output?: string }) => {
if (!d.ok) alert(`${t.name} update failed:\n\n${(d.output ?? "unknown error").slice(0, 800)}`); if (!d.ok) alert(`${t.name} update failed:\n\n${(d.output ?? "unknown error").slice(0, 800)}`);
refresh(); // The daemon re-probes after updating; a freshly-replaced binary can take a
setTimeout(refresh, 3500); // let the daemon's post-update re-probe land // few seconds to report (macOS Gatekeeper re-verify), so poll a few times.
[0, 4000, 9000, 15000].forEach((ms) => setTimeout(refresh, ms));
}) })
.catch((e: Error) => alert(`${t.name} update error: ${e.message}`)) .catch((e: Error) => alert(`${t.name} update error: ${e.message}`))
.finally(() => setBusy(null)); .finally(() => setBusy(null));