Skip to content

Local installs have no WP-Cron/Action Scheduler heartbeat — Data Machine queue starves on headless Studio sites #262

Description

@chubes4

Problem

On a headless local Studio install (no browser traffic), WP-Cron never fires — it is HTTP-triggered. Observed on a production intelligence install on 2026-07-12: every cron event overdue since 2026-06-22 (wp cron event list shows action_scheduler_run_queue next-run 2026-06-22 23:06, all core events similarly frozen), 36 due Data Machine actions starved, the nightly datamachine_recurring_workspace_retention_cleanup recurrence pending for 20 days, and system-task jobs (e.g. a Workspace Retention Cleanup job with a valid pending datamachine_execute_step action) parked in pending indefinitely. The queue only advanced when an agent session happened to run wp datamachine worker run/drain by hand — the last job completion coincided with a manual CLI session, not the scheduler.

wp-coding-agents already owns the service layer for these installs: it provisions launchd (macOS) and systemd (VPS) services for chat bridges (kimaki, cc-connect, telegram) via setup.sh/upgrade.sh and bridge templates. But nothing provisions a scheduler heartbeat, so the substrate the bridges depend on (Data Machine jobs, retention, recurring flows, wiki maintenance) silently starves between agent sessions.

Fix shape

Provision a queue heartbeat service alongside the bridge services, per detected environment:

  • macOS local: a launchd agent (e.g. com.wp.datamachine-worker.plist) running a bounded loop on an interval — e.g. wp datamachine worker run --once (or a small --time-limit) every 1–5 minutes per registered site.
  • VPS: the systemd timer equivalent.
  • Managed by setup.sh/upgrade.sh like the existing bridge services (install, adopt, restart on upgrade), with the same identity-adoption handling the bridge services already have.
  • Multi-site aware: iterate registered sites (or accept a site list) rather than hardcoding one path.

Data Machine's worker run is already designed as the safe external entrypoint (bounded, composes stuck-recovery + drain, lane-locked), so the service is a thin invoker — no new runtime semantics needed.

Related: Extra-Chill/data-machine#2889 (worker health should surface stale Action Scheduler dispatcher state so this failure mode is visible instead of silent).

How to verify

  1. Fresh local Studio site with wp-coding-agents setup complete; do not open the site in a browser.
  2. wp cron event list — without the fix, action_scheduler_run_queue next-run drifts into the past and stays there.
  3. Schedule any Data Machine system task; observe it stuck pending.
  4. With the heartbeat service installed: the due actions process within one interval and wp datamachine jobs liveness reports no scheduler starvation.

AI assistance

  • AI assistance: Yes
  • Tool(s): Claude (Opus 4.5) via Kimaki/OpenCode
  • Used for: Root-cause diagnosis from live cron/queue evidence and issue drafting

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions