Summary
Data Machine correctly enqueues workspace retention tasks, but worker health only reports a count of due actions. It does not identify that the Action Scheduler dispatcher trigger is stale, leaving queued jobs without an actionable diagnosis.
Live Reproduction
Job 2128 was created at 2026-07-12 01:45:52 by the Data Machine Code workspace cleanup CLI. Its engine data identifies workspace_retention_cleanup and task_params.source = workspace_cleanup_cli.
The core path is not missing a caller-side scheduling step:
Action Scheduler contains the expected action:
{
"id": 16173,
"hook": "datamachine_execute_step",
"status": "pending",
"args": { "job_id": 2128, "flow_step_id": "ephemeral_step_0" },
"scheduled_date": "2026-07-12 01:45:52 +0000"
}
The actual failure is dispatcher starvation:
wp datamachine worker status --format=json reports due_actions: 36 and an unlocked worker lock.
- Recurring action
16082 (datamachine_recurring_workspace_retention_cleanup) has been pending since 2026-06-22 09:40:34 UTC, with only an action created log entry.
wp cron event list reports action_scheduler_run_queue due since 2026-06-22 23:06:18 UTC.
wp datamachine jobs liveness --limit=100 --format=json identifies seven older pending execute-step jobs as scheduler_starved. The default liveness limit inspects only the 50 oldest processing jobs, so it does not include newer job 2128.
Fix Shape
- Extend
datamachine worker status with Action Scheduler dispatch health: queue-trigger state, oldest due Data Machine action, and an explicit scheduler_dispatcher_starved condition.
- Include a safe supported remediation recommendation without mutating job rows.
- Add coverage for an overdue execute-step action plus stale Action Scheduler queue trigger.
AI assistance
- AI assistance: Yes
- Tool(s): Claude (Opus 4.5) via Kimaki/OpenCode subagent
- Used for: Queue diagnosis and issue drafting from live job-table evidence
Summary
Data Machine correctly enqueues workspace retention tasks, but worker health only reports a count of due actions. It does not identify that the Action Scheduler dispatcher trigger is stale, leaving queued jobs without an actionable diagnosis.
Live Reproduction
Job
2128was created at2026-07-12 01:45:52by the Data Machine Code workspace cleanup CLI. Its engine data identifiesworkspace_retention_cleanupandtask_params.source = workspace_cleanup_cli.The core path is not missing a caller-side scheduling step:
TaskScheduler::schedule()delegates todatamachine/execute-workflow: TaskScheduler.php#L164-L263.ExecuteWorkflowAbility::execute()persists the job and dispatchesdatamachine_schedule_next_step: ExecuteWorkflowAbility.php#L128-L228.datamachine_execute_stepwithas_schedule_single_action(): ScheduleNextStepAbility.php#L160-L197.Action Scheduler contains the expected action:
{ "id": 16173, "hook": "datamachine_execute_step", "status": "pending", "args": { "job_id": 2128, "flow_step_id": "ephemeral_step_0" }, "scheduled_date": "2026-07-12 01:45:52 +0000" }The actual failure is dispatcher starvation:
wp datamachine worker status --format=jsonreportsdue_actions: 36and an unlocked worker lock.16082(datamachine_recurring_workspace_retention_cleanup) has been pending since2026-06-22 09:40:34 UTC, with only anaction createdlog entry.wp cron event listreportsaction_scheduler_run_queuedue since2026-06-22 23:06:18 UTC.wp datamachine jobs liveness --limit=100 --format=jsonidentifies seven older pending execute-step jobs asscheduler_starved. The default liveness limit inspects only the 50 oldest processing jobs, so it does not include newer job 2128.Fix Shape
datamachine worker statuswith Action Scheduler dispatch health: queue-trigger state, oldest due Data Machine action, and an explicitscheduler_dispatcher_starvedcondition.AI assistance