Problem
#1922 added the generic executeBoundedRuntimePlan() scheduler, but the public PHPUnit recipe path still cannot execute a bounded plan through one prepared workspace/runtime/service lifecycle. The merged integration uses PHPUnit-shaped entries without invoking PHPUnit, and no CLI/API accepts a base recipe plus plan entries. This leaves the downstream 680-suite parity consumer unable to use the primitive without importing CLI internals or recreating generic recipe lifecycle behavior.
Follow-up to #1920 and #1922. Downstream tracker: https://linear.app/a8c/issue/BET-12/local-wordpresscom-development-with-wpcom-codebox.
Expected contract
- Add a public recipe-plan executor that materializes one workspace/runtime and starts declared services once.
- Execute actual recipe command entries with bounded concurrency and per-entry argv/environment/timeout/process/artifact identity.
- Expose the executor through a documented Node API and CLI JSON contract.
- Return stable per-entry output references, duration, exit/timeout state, and aggregate counts.
- Preserve selective retry and existing single-recipe behavior.
- Prove at least two real PHPUnit entries share one disposable MariaDB allocation with distinct database indexes.
Acceptance criteria
- Deterministic lifecycle and scheduler tests exercise the public recipe-plan adapter.
- CLI contract validation covers input/output schemas and fail-closed safety.
- Docker integration invokes real PHPUnit commands, not placeholders.
- Existing build, Agent Task Contracts, and single PHPUnit recipe tests remain green.
- Generic WP Codebox contains no WPCOM or TeamCity semantics.
Problem
#1922 added the generic
executeBoundedRuntimePlan()scheduler, but the public PHPUnit recipe path still cannot execute a bounded plan through one prepared workspace/runtime/service lifecycle. The merged integration uses PHPUnit-shaped entries without invoking PHPUnit, and no CLI/API accepts a base recipe plus plan entries. This leaves the downstream 680-suite parity consumer unable to use the primitive without importing CLI internals or recreating generic recipe lifecycle behavior.Follow-up to #1920 and #1922. Downstream tracker: https://linear.app/a8c/issue/BET-12/local-wordpresscom-development-with-wpcom-codebox.
Expected contract
Acceptance criteria