You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
tool result: from: "Refining", to: "To Do", transitioned: true
Important additional finding
There is also a watcher/cron instruction in that same session lane that explicitly tells the orchestrator to requeue #74 from hold when it decides the issue is ready:
If the issue is ready to be requeued for developer work, requeue it with task_start(issueId=74, level=medior).
So the still-live loop family is not heartbeat health repair. It is the shared explicit restart machinery exposed through orchestrator/session behavior, including possible automation/watcher flows, which records normalized workflow.requeue with source: "system".
Why this needs its own fix
We still need normal intentional human restarts from hold to work.
What appears to be missing is a guardrail that distinguishes:
explicit, operator-intended restart from hold
orchestrator/session automation or ambiguous assistant follow-through that should not silently restart a blocked issue
Scope
Investigate and fix the remaining explicit requeue path around:
lib/tools/tasks/task-start.ts
any shared restart / queue-transition helpers used by orchestrator or cron/session automation
any watcher, intervention, or operator-follow-through paths that can invoke task_start on a hold-state issue after a blocked worker result
event/source semantics for workflow.requeue so live diagnostics can distinguish manual restart vs automated/system restart
Acceptance criteria
Identify the exact code and behavior path that allows orchestrator/session automation to move a held issue from Refining -> To Do via task_start after a blocked worker result.
Prevent unintended/automatic requeues from that path.
Preserve normal explicit human restart behavior for held issues.
Add regression coverage for the explicit workflow.requeue after hold case, not just stale heartbeat snapshot behavior.
Summary
Issue #227 fixed one stale-snapshot / heartbeat-health race, but the remaining PhysioLink #74 loop is still reproducible through a different path.
The remaining
workflow.requeueevents are coming from explicittask_startcalls issued by the orchestrator session, not from heartbeat label repair.Root cause found
I traced the live
workflow.requeueevents for PhysioLink issue #74 back to the main PhysioLink Telegram orchestrator session transcript:Session file:
~/.openclaw/agents/devclaw/sessions/7f4d6a98-186a-4ece-a800-31573a5a89f6-topic-1.jsonlConfirmed
task_startcalls for issue#74:2026-05-07T01:28:52.215Z->task_start(issueId=74, level=senior)fromPlanning -> To Do2026-05-08T02:58:37.127Z->task_start(issueId=74, level=junior)fromRefining -> To Do2026-05-08T03:22:49.663Z->task_start(issueId=74, level=medior)fromRefining -> To DoThe
02:58and03:22cases are the remaining loop path.Example transcript excerpt for the
02:58requeue:queue it back for the developer.I’m sending #74 back to the developer queue for a conflict-resolution pass.task_start { channelId: "-1003718418486", messageThreadId: 1, issueId: 74, level: "junior" }from: "Refining", to: "To Do", transitioned: trueExample transcript excerpt for the
03:22requeue:make it happen.task_start { channelId: "-1003718418486", messageThreadId: 1, issueId: 74, level: "medior" }from: "Refining", to: "To Do", transitioned: trueImportant additional finding
There is also a watcher/cron instruction in that same session lane that explicitly tells the orchestrator to requeue #74 from hold when it decides the issue is ready:
If the issue is ready to be requeued for developer work, requeue it with task_start(issueId=74, level=medior).So the still-live loop family is not heartbeat health repair. It is the shared explicit restart machinery exposed through orchestrator/session behavior, including possible automation/watcher flows, which records normalized
workflow.requeuewithsource: "system".Why this needs its own fix
We still need normal intentional human restarts from hold to work.
What appears to be missing is a guardrail that distinguishes:
Scope
Investigate and fix the remaining explicit requeue path around:
lib/tools/tasks/task-start.tstask_starton a hold-state issue after a blocked worker resultworkflow.requeueso live diagnostics can distinguish manual restart vs automated/system restartAcceptance criteria
Refining -> To Doviatask_startafter a blocked worker result.workflow.requeueafter hold case, not just stale heartbeat snapshot behavior.Related
task_start/ orchestrator-session requeue path still live after both fixes.