v0.22.1: sync CLI, reaper TZ fix, maintenance-cron self-heal

- wp prautoblogger generate --sync: synchronous VPS orchestrator mode.
  Acquires lock in-process, calls on_orchestrate_tick() then loops
  on_generate_tick() up to 20 ticks. Emits JSON summary; exits 0/1.
- Generation_Checkpoint_Runner::set_sync_mode(): static flag suppresses
  wp-cron reschedule inside on_generate_tick() when the VPS external
  loop is the driver. No effect on existing async (cron/AJAX) paths.
- Run_Reaper TZ fix: sweep_stuck_stages() + sweep_stuck_runs() now use
  wp_date() for $cutoff so it matches updated_at's local-TZ storage.
  gmdate() was 8h behind on Hostinger (UTC+8) — latent for old stale
  runs but would suppress reaping of same-day-stalled runs.
- DB_Migrations v0221 self-heal: restores missing maintenance crons
  (reap_orphan_research_rows, collect_metrics, sync_runware_models).
  prautoblogger_daily_generation deliberately NOT re-registered — VPS
  systemd timer owns generation scheduling. Note: wp-cron reliability on
  this Hostinger host is suspect; maintenance crons are low-stakes.

Agent-Session: prab-reliability-20260622
This commit is contained in:
peptiderepo
2026-06-22 16:32:13 +00:00
parent a2af04f2c4
commit 4ca66bcdc1
6 changed files with 236 additions and 32 deletions

View File

@@ -133,7 +133,9 @@ class PRAutoBlogger_Run_Reaper {
* @param int $seconds Expected seconds (default 300).
*/
$expected = (int) apply_filters( 'prautoblogger_filter_stage_expected_seconds', self::EXPECTED_STAGE_SECONDS );
$cutoff = gmdate( 'Y-m-d H:i:s', time() - ( 2 * $expected ) );
// Use wp_date() so the cutoff is expressed in the site's local timezone,
// matching the updated_at values written by current_time('mysql') (v0.22.1 TZ fix).
$cutoff = wp_date( 'Y-m-d H:i:s', time() - ( 2 * $expected ) );
$now = current_time( 'mysql' );
// phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery
@@ -169,7 +171,8 @@ class PRAutoBlogger_Run_Reaper {
* @param int $seconds Expected seconds (default 1800).
*/
$expected = (int) apply_filters( 'prautoblogger_filter_expected_run_seconds', self::EXPECTED_RUN_SECONDS );
$cutoff = gmdate( 'Y-m-d H:i:s', time() - ( 2 * $expected ) );
// Use wp_date() so the cutoff matches updated_at's local-timezone storage (v0.22.1 TZ fix).
$cutoff = wp_date( 'Y-m-d H:i:s', time() - ( 2 * $expected ) );
// phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching
$stuck = $wpdb->get_col(