Skip to content

fix #85871: [Bug]: Heartbeat scheduler silently fails to fire on 5.20 and all 5.x versions (regression from 4.23)#88970

Merged
vincentkoc merged 3 commits into
openclaw:mainfrom
zhangguiping-xydt:feat/issue-85871
Jun 16, 2026
Merged

fix #85871: [Bug]: Heartbeat scheduler silently fails to fire on 5.20 and all 5.x versions (regression from 4.23)#88970
vincentkoc merged 3 commits into
openclaw:mainfrom
zhangguiping-xydt:feat/issue-85871

Conversation

@zhangguiping-xydt

@zhangguiping-xydt zhangguiping-xydt commented Jun 1, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Problem: scheduled heartbeat turns could be accepted by the scheduler but never reach a real model turn when reply work was already active around the same session/agent.
  • Why it matters / User impact: affected 5.x installs can look like heartbeat is configured and wake requests are accepted, but the heartbeat tick can be consumed as handled without the main agent session receiving the heartbeat prompt. That matches the reporter-visible failure mode where a manual wake can return OK while no model inference reaches the main agent session.
  • Root cause: the source-of-truth busy-state lifecycle was split across the heartbeat scheduler boundary and reply-turn admission. runHeartbeatOnce checked queued lanes / active reply work before calling getReplyFromConfig, but downstream reply admission intentionally rejects heartbeat turns when another reply run wins the same session slot. Because that admission rejection surfaced back to the heartbeat runner as an empty reply, the scheduler emitted ok-empty / returned ran instead of the retryable requests-in-flight result. The existing active embedded-run path had the same root contract failure: background heartbeat work could enter a reply path that intentionally drops heartbeat turns rather than queueing them.
  • Why this is root-cause fix: heartbeat scheduling is the source-of-truth owner for deciding whether background heartbeat work dispatches or retries. This patch restores that invariant at the scheduler boundary: scheduled heartbeat dispatch now defers before model dispatch when same-agent embedded work is active, and it rechecks the resolved run session after getReplyFromConfig returns an empty result so a reply-admission race is converted into requests-in-flight instead of a phantom ran. That fixes the state-owner contract rather than masking the symptom with a provider-specific retry, timeout, or fallback.
  • Fix classification: Root cause fix.
  • Solution: return the existing retryable requests-in-flight status when heartbeat dispatch collides with active embedded/reply work, including the race where activity appears after preflight but before reply admission.
  • What changed: heartbeat runner now checks active embedded-run session keys alongside active reply runs before dispatch, and treats an empty reply result as busy when the run session is still active after the reply runtime returns.
  • What did NOT change: heartbeat cadence calculation, public config shape, provider/model routing, outbound delivery contracts, persisted session formats, and visible user-turn queue policy are unchanged. Manual/immediate wakes still keep their existing semantics for other active sessions; the fix only prevents busy heartbeat work from being marked completed without a model turn.
  • Related open PR scan: this is an update to the existing linked PR fix #85871: [Bug]: Heartbeat scheduler silently fails to fire on 5.20 and all 5.x versions (regression from 4.23) #88970, not a new competing PR. The current discussion/review evidence points this PR at issue [Bug]: Heartbeat scheduler silently fails to fire on 5.20 and all 5.x versions (regression from 4.23) #85871 and RF-001; no separate canonical PR is used as the source of truth for this heartbeat busy-state boundary.
  • Patch quality notes: the retry/default-looking changes are limited to the heartbeat scheduler guardrail. The requests-in-flight result is the existing wake-layer retry contract, and the test-only return undefined simulates the actual reply-admission skip that previously became phantom ran; it is not a production fallback, catch-all, or symptom-masking default.
  • Maintainer-ready confidence: High for the gateway scheduler starting and reaching dispatch on current head, and high for the busy/retry boundary. Medium for the reporter's exact Ubuntu/Ollama deployment because local proof used an available local provider/model and shortened the interval instead of waiting a full production 5-minute cadence.
  • Architecture / source-of-truth check: the heartbeat runner remains the source-of-truth dispatch boundary for scheduled heartbeat work. The patch reads the existing active reply/embedded-run registries; it does not add downstream string matching, mirrored busy state, provider-specific behavior, or persistence migrations.

Linked context

Real behavior proof

  • Behavior addressed: the live gateway heartbeat scheduler starts and reaches agent/model dispatch, and scheduled heartbeats defer instead of being silently consumed while same-agent work is active.

  • Real environment tested: local OpenClaw gateway started through pnpm gateway:dev with isolated runtime state, a short every: 2s heartbeat, target: none, and a real configured provider/model. The busy/retry boundary was exercised through the actual scheduler wake path with active embedded work registered for agent:main:main.

  • Exact steps or command run after this patch:

    • daily-fix run-validation --name live-heartbeat-gateway-current -- bash heartbeat-live-gateway-proof.sh
    • daily-fix run-validation --name heartbeat-busy-retry-current -- pnpm exec tsx heartbeat-scheduled-embedded-proof.ts
  • Evidence after fix: live gateway log excerpt shows the gateway became ready, the scheduler emitted [heartbeat] started, and a heartbeat turn reached agent dispatch:

    READY=ok
    HEARTBEAT_STARTED=1
    HEARTBEAT_DISPATCH_AFTER_STARTED=1
    HEARTBEAT_RESULT_SIGNAL=0
    2026-06-10T02:46:14.313+08:00 [gateway] http server listening (8 plugins: acpx, browser, canvas, device-pair, file-transfer, memory-core, phone-control, talk-voice; 18.8s)
    2026-06-10T02:46:14.329+08:00 [gateway] ready
    2026-06-10T02:46:15.063+08:00 [heartbeat] started
    2026-06-10T02:46:40.733+08:00 [agent/embedded] [trace:embedded-run] core-plugin-tool stages: runId=9f3da39f-5bc1-4dc3-ba19-2a88326fdea2 sessionId=e287404c-562f-4139-baee-21beb02b705c phase=core-plugin-tools ... attempt:tools-allow:0ms
    

    The busy/retry proof then showed the first scheduled wake deferred before dispatch while active embedded work existed, and the retry dispatched after the busy run cleared:

    [proof] active embedded run registered: sessionId=proof-active-embedded-run sessionKey=agent:main:main
    [heartbeat] started
    [proof] scheduled wake attempt #1: source=interval intent=scheduled reason=interval activeBefore=["agent:main:main"] result={"status":"skipped","reason":"requests-in-flight"} dispatchCount=0
    [proof] active embedded run cleared after first busy skip: sessionId=proof-active-embedded-run
    [proof] model dispatch reached after busy cleared: dispatchCount=1
    [proof] scheduled wake attempt #2: source=interval intent=scheduled reason=interval activeBefore=[] result={"status":"ran","durationMs":160} dispatchCount=1
    [proof] PASS: scheduled heartbeat deferred while active embedded work existed, then wake retry dispatched after it cleared
    
  • Observed result after fix: a real gateway heartbeat cycle no longer stayed silent after startup; it logged scheduler startup and reached agent/model dispatch on the configured interval. When same-agent embedded work was active, the scheduled wake returned the retryable requests-in-flight result before model dispatch, then retried and dispatched after the active run cleared.

  • What was not tested: the reporter's exact Ubuntu/Ollama install and a full 5-minute interval / 10+ minute wall-clock wait. The local proof shortened the interval to exercise the same scheduler path without waiting multiple production cycles.

Tests and validation

  • Target test file: src/infra/heartbeat-runner.skips-busy-session-lane.test.ts covers the reply-admission race where activity appears after heartbeat preflight and getReplyFromConfig returns an empty result; src/infra/heartbeat-runner.returns-default-unset.test.ts covers active embedded-run pre-dispatch deferral for the resolved heartbeat session and another same-agent session.
  • Scenario locked in: scheduled heartbeat work that collides with same-session/same-agent active reply or embedded work returns the retryable requests-in-flight skip instead of phantom ran, then the wake retry can dispatch after the active run clears.
  • Why this is the smallest reliable guardrail: the tests pin the scheduler/reply-admission boundary that lost heartbeat turns without mocking provider-specific Ollama behavior, changing public config/schema contracts, or rewriting visible user-turn queue policy.
  • daily-fix run-validation --name heartbeat-busy-regression-current-head -- node scripts/run-vitest.mjs run src/infra/heartbeat-runner.skips-busy-session-lane.test.ts src/infra/heartbeat-runner.returns-default-unset.test.ts src/infra/heartbeat-wake.test.ts — passed: 3 files, 75 tests.
  • daily-fix run-validation --name heartbeat-lint-current-head -- pnpm exec oxlint src/infra/heartbeat-runner.ts src/infra/heartbeat-runner.skips-busy-session-lane.test.ts — passed.
  • daily-fix run-validation --name live-heartbeat-gateway-current -- bash heartbeat-live-gateway-proof.sh — passed; real pnpm gateway:dev startup logged READY=ok, [heartbeat] started, and HEARTBEAT_DISPATCH_AFTER_STARTED=1.
  • daily-fix run-validation --name heartbeat-busy-retry-current -- pnpm exec tsx heartbeat-scheduled-embedded-proof.ts — passed; scheduled source=interval / intent=scheduled heartbeat returned requests-in-flight while agent:main:main had active embedded work, then the wake retry reached model dispatch and returned ran after the embedded run cleared.

Risk checklist

  • Risk labels considered: compatibility, session-state.
  • Risk explanation: merge risk is limited to scheduled heartbeat retry behavior when active reply/embedded work is already occupying the relevant heartbeat session or same-agent background-work boundary.
  • Why acceptable: this aligns heartbeat behavior with the existing wake retry contract. A busy heartbeat is now retried by the scheduler instead of being counted as completed before a model turn happens.
  • Public contract / config boundary: no public config schema, defaults, migration behavior, provider selection, channel delivery contract, or session-store format changes.
  • Out of scope / not changed: no provider-specific Ollama workaround, no full 5-minute production wait in local proof, no channel delivery rewrite, no reply queue policy rewrite, and no legacy config migration change.

Current review state

  • Which bot or reviewer comments were addressed?
    • RF-001 [P1]: addressed with current-head live gateway proof plus scheduler busy/retry proof.
  • Remaining maintainer decision points:
    • The proof uses a shortened 2-second heartbeat interval rather than waiting 10+ minutes on the reporter's exact cadence.
    • The local provider/model differs from the reporter's Ollama deployment, but it exercises the same gateway scheduler and heartbeat dispatch path.

@openclaw-barnacle openclaw-barnacle Bot added size: S triage: mock-only-proof Candidate: PR proof only shows tests, mocks, snapshots, lint, typecheck, or CI. labels Jun 1, 2026
@clawsweeper

clawsweeper Bot commented Jun 1, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs maintainer review before merge. Reviewed June 15, 2026, 6:09 AM ET / 10:09 UTC.

Summary
The PR makes scheduled heartbeat dispatch defer on active embedded runs and reply-admission races by returning retryable requests-in-flight, with focused regression tests.

PR surface: Source +29, Tests +64. Total +93 across 3 files.

Reproducibility: yes. at source level: current main and v2026.6.6 only check active reply runs and still classify an empty heartbeat reply as ran; the PR adds tests for the active embedded-run and reply-admission race paths. I did not run the reporter's exact Ubuntu/Ollama live reproduction in this read-only review.

Review metrics: none identified.

Merge readiness
Overall: 🦞 diamond lobster
Proof: 🦞 diamond lobster
Patch quality: 🦞 diamond lobster
Result: ready for maintainer review.

Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch.

Risk before merge

  • [P1] The remaining proof gap is environmental: the supplied real behavior proof uses a shortened heartbeat interval and a local provider rather than the reporter's exact Ubuntu/Ollama install and full 5-minute cadence.

Maintainer options:

  1. Decide the mitigation before merge
    Land the focused scheduler-boundary fix after maintainer review and current-head CI, preserving the existing requests-in-flight wake retry contract without adding provider-specific behavior or config.
  2. Pause or close
    Do not merge this PR until maintainers decide whether the risk is worth taking.

Next step before merge

  • [P2] No repair lane is needed; the remaining action is maintainer review and normal merge gating for the current PR head or clean merge ref.

Security
Cleared: The diff changes heartbeat scheduler logic and tests only; it adds no dependencies, workflows, package metadata, secret handling, or new code-execution surface.

Review details

Best possible solution:

Land the focused scheduler-boundary fix after maintainer review and current-head CI, preserving the existing requests-in-flight wake retry contract without adding provider-specific behavior or config.

Do we have a high-confidence way to reproduce the issue?

Yes, at source level: current main and v2026.6.6 only check active reply runs and still classify an empty heartbeat reply as ran; the PR adds tests for the active embedded-run and reply-admission race paths. I did not run the reporter's exact Ubuntu/Ollama live reproduction in this read-only review.

Is this the best way to solve the issue?

Yes: the heartbeat scheduler is the narrow owner for deciding whether background heartbeat work dispatches or retries, and the PR uses the existing retryable busy contract rather than adding provider-specific retries, new config, or a downstream fallback.

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against 0314819f918a.

Label changes

Label justifications:

  • P1: This PR addresses a user-visible heartbeat regression where scheduled wakes can be accepted without a model turn reaching the agent session.
  • rating: 🦞 diamond lobster: Overall readiness is 🦞 diamond lobster; proof is 🦞 diamond lobster and patch quality is 🦞 diamond lobster.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Sufficient (logs): The PR body includes after-fix gateway logs and scheduler busy/retry output showing heartbeat dispatch after startup, requests-in-flight while embedded work is active, and dispatch after the busy run clears.
  • proof: sufficient: Contributor real behavior proof is sufficient. The PR body includes after-fix gateway logs and scheduler busy/retry output showing heartbeat dispatch after startup, requests-in-flight while embedded work is active, and dispatch after the busy run clears.
Evidence reviewed

PR surface:

Source +29, Tests +64. Total +93 across 3 files.

View PR surface stats
Area Files Added Removed Net
Source 1 36 7 +29
Tests 2 64 0 +64
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 3 100 7 +93

What I checked:

  • Live PR state: Live GitHub shows this PR is open, mergeable, clean, has sufficient-proof labels, and closes the heartbeat scheduler issue. (e331da88eef5)
  • Current main lacks embedded-run guard: Current main checks active reply runs for same-agent scheduled heartbeats, but does not consult active embedded-run session keys before dispatch. (src/infra/heartbeat-runner.ts:1358, 0314819f918a)
  • Current main can still report empty replies as ran: Current main emits ok-empty, updates heartbeat bookkeeping, consumes inspected events, and returns ran when no heartbeat tool response or outbound reply payload exists. (src/infra/heartbeat-runner.ts:1839, 0314819f918a)
  • PR merge ref adds the busy-state boundary: The clean merge ref wires listActiveEmbeddedRunSessionKeys into heartbeat deps, checks same-agent and resolved-session embedded activity, and converts the empty-reply active-run race into requests-in-flight. (src/infra/heartbeat-runner.ts:1368, fae586290507)
  • Reply admission contract supports the fix: Heartbeat reply turns are skipped as active-run when a session slot is unavailable, so a scheduler-level retryable busy result is the right owner boundary. (src/auto-reply/reply/reply-turn-admission.ts:62, 0314819f918a)
  • Wake retry contract already exists: requests-in-flight is an existing retryable heartbeat busy skip reason, and the wake layer requeues the same wake target for retry. (src/infra/heartbeat-wake.ts:19, 0314819f918a)

Likely related people:

  • steipete: GitHub path history shows repeated recent heartbeat runner and wake scheduling work that this fix builds on, including active-reply deferral and stale scheduler deferral handling. (role: feature-history contributor; confidence: high; commits: bea4f0d2f4b4, bbc4bee7a22b, 31169ff3b436; files: src/infra/heartbeat-runner.ts, src/infra/heartbeat-wake.ts, src/auto-reply/reply/queue-policy.ts)
  • joshavant: Recent merged work touched the same runHeartbeatOnce decision surface, and the PR discussion explicitly asked for his sanity check because of that recent context. (role: recent adjacent contributor; confidence: medium; commits: 3643de4ba7b6; files: src/infra/heartbeat-runner.ts)
  • fuller-stack-dev: The active-run queue policy that drops heartbeat turns during active work traces to mid-turn steering work used by this PR's root-cause path. (role: reply admission contributor; confidence: medium; commits: 70df2b8fe28d; files: src/auto-reply/reply/queue-policy.ts)
What the crustacean ranks mean
  • 🦀 challenger crab: rare, exceptional readiness with strong proof, clean implementation, and convincing validation.
  • 🦞 diamond lobster: very strong readiness with only minor maintainer review expected.
  • 🐚 platinum hermit: good normal PR, likely mergeable with ordinary maintainer review.
  • 🦐 gold shrimp: useful signal, but proof or patch confidence is still limited.
  • 🦪 silver shellfish: thin signal; proof, validation, or implementation needs work.
  • 🧂 unranked krab: not merge-ready because proof is missing/unusable or there are serious correctness or safety concerns.
  • 🌊 off-meta tidepool: rating does not apply to this item.

Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

How this review workflow works
  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.

@clawsweeper clawsweeper Bot added rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. labels Jun 1, 2026
@openclaw-barnacle openclaw-barnacle Bot added proof: supplied External PR includes structured after-fix real behavior proof. and removed triage: mock-only-proof Candidate: PR proof only shows tests, mocks, snapshots, lint, typecheck, or CI. labels Jun 1, 2026
@clawsweeper clawsweeper Bot added the P1 High-priority user-facing bug, regression, or broken workflow. label Jun 1, 2026
@vincentkoc vincentkoc self-assigned this Jun 1, 2026
@vincentkoc vincentkoc added proof: sufficient ClawSweeper judged the real behavior proof convincing. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. and removed rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. labels Jun 1, 2026
@clawsweeper clawsweeper Bot added the rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. label Jun 1, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label Jun 1, 2026
@clawsweeper clawsweeper Bot added rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. and removed rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. labels Jun 1, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label Jun 8, 2026
@clawsweeper clawsweeper Bot added the proof: sufficient ClawSweeper judged the real behavior proof convincing. label Jun 9, 2026
@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label Jun 10, 2026
@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🦞 diamond lobster Very strong PR readiness with only minor maintainer review expected. and removed rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. labels Jun 10, 2026
@zhangguiping-xydt

Copy link
Copy Markdown
Contributor Author

@vincentkoc, PR's been with you since last week. ClawSweeper says ready. Mind taking a peek? Thanks!

@zhangguiping-xydt

Copy link
Copy Markdown
Contributor Author

@joshavant when you have time, could you sanity-check #88970?

It is a small heartbeat scheduler fix for #85871. The PR makes active embedded-run / reply-admission races return retryable requests-in-flight instead of being counted as ran without a model turn.

Current state: rating: 🦞 diamond lobster, proof: sufficient, ready for maintainer look, no merge-risk label. I’m asking you specifically because you recently touched src/infra/heartbeat-runner.ts, so you may be the lowest-context reviewer for this one.

@openclaw-barnacle openclaw-barnacle Bot removed the proof: sufficient ClawSweeper judged the real behavior proof convincing. label Jun 16, 2026
@vincentkoc

Copy link
Copy Markdown
Member

Maintainer verification complete for 224b0c8c5ccea5505cb54c72b3e95439252f612e.

  • Focused proof: node scripts/run-vitest.mjs src/auto-reply/reply/agent-runner.runreplyagent.e2e.test.ts src/infra/heartbeat-runner.returns-default-unset.test.ts src/infra/heartbeat-runner.skips-busy-session-lane.test.ts (118 tests passed)
  • Regression proof includes a replacement visible run racing after an empty heartbeat; cleanup/retry now uses the exact invocation's admission snapshot
  • Fresh branch review: no actionable findings, confidence 0.93
  • Exact-head CI: green
  • Existing PR real-behavior proof covers live gateway heartbeat dispatch and same-agent deferral

Land-ready. The reporter's exact Ubuntu/Ollama installation was not reproduced; the repaired invariant is provider-independent heartbeat admission state.

@vincentkoc
vincentkoc merged commit 2196ea2 into openclaw:main Jun 16, 2026
166 of 167 checks passed
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request Jun 17, 2026
… on 5.20 and all 5.x versions (regression from 4.23) (openclaw#88970)

* fix heartbeat deferral during active embedded runs

* fix heartbeat admission busy retry

* fix(heartbeat): bind retry to local admission

---------

Co-authored-by: Vincent Koc <[email protected]>
crh-code pushed a commit to crh-code/openclaw that referenced this pull request Jun 18, 2026
… on 5.20 and all 5.x versions (regression from 4.23) (openclaw#88970)

* fix heartbeat deferral during active embedded runs

* fix heartbeat admission busy retry

* fix(heartbeat): bind retry to local admission

---------

Co-authored-by: Vincent Koc <[email protected]>
GusAI40 pushed a commit to GusAI40/openclaw-1 that referenced this pull request Jun 22, 2026
26194 drift commits, 222 flagged (security/regression keywords).
Notable: XSS fix (openclaw#83104), PATH injection (openclaw#73264), npm_execpath
injection (openclaw#73262), implicit tool grant fix (openclaw#75055), payment
credential redaction (openclaw#75230), heartbeat regression (openclaw#88970).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

P1 High-priority user-facing bug, regression, or broken workflow. proof: supplied External PR includes structured after-fix real behavior proof. rating: 🦞 diamond lobster Very strong PR readiness with only minor maintainer review expected. size: S status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: Heartbeat scheduler silently fails to fire on 5.20 and all 5.x versions (regression from 4.23)

2 participants