The frontend status poller measured elapsed time from `started` (set once
at the beginning of the run) and declared a stall at 300s. Three articles
take ~6 minutes total, so the poller always false-alarmed on article 3.
Now every stage broadcast writes `last_updated` into the transient, and
the stall check compares idle time since the last update — not since the
run started. This lets N-article runs complete without false timeout as
long as each individual article finishes within 5 minutes.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The pipeline previously ran all articles sequentially in a single PHP
process. On Hostinger, this timed out at ~120s — enough for 1 article
but not 2+. Now the pipeline generates article 1 in-process, then
queues articles 2..N as individual WP-Cron events. Each article gets
its own PHP process with its own execution time budget, so we can
generate any number of articles regardless of server time limits.
Architecture:
- Pipeline_Runner: orchestrate (collect+analyze+score) + first article,
then serialize remaining ideas to wp_options and chain cron events
- Article_Worker (new): focused single-article worker extracted from
the pipeline loop — content gen + editorial + publish
- Executor: new on_process_article_queue() handler for chained events;
status poller re-schedules orphaned queue jobs automatically
- Article_Idea: added to_array() for queue serialization
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>