sandermuller/boost-pipeline
A Laravel package for building and running pipelines composed of reusable stages. It helps organize multi-step application logic into clear, testable flows that are easier to maintain and extend.
Architecture fit
boost-pipeline is a Laravel package (service provider + pipeline:history artisan command + a web page) that orchestrates shell steps for an agent-driven workflow. It fits teams already on Laravel who want step execution, run state, and history without standing up a separate orchestrator.Shell::exclusive('name', $capacity) adds machine-wide concurrency caps, and Shell::onAbort('<cmd>') adds compensating cleanup. That is the right direction for long-running, multi-step agent work, but it means the package now owns resource contention semantics we previously owned ourselves.duration_ms and slot_wait_ms on step results, plus waiting_for_slot in next_step, give us the raw data for queue-latency and capacity reporting.Integration feasibility
exclusive() (see key questions — this is the single largest unknown).onAbort, exclusive) is opt-in; teams that only consume next_step and step results can adopt v0.22.0 without touching their configs.Technical risk
next_step can now return waiting_for_slot. Consumers with a closed enum, strict validation, or match on status will throw or stall. Wall-clock timeout expectations also shift, because slot wait no longer counts toward the timeout — a step can queue longer than the timeout value suggests.exclusive() requires withResponseWindow() and a config without one is refused at load. Failure is loud and early (good), but it couples two features and blocks adoption of slots in non-interactive pipelines.open_run now refuses once vendor/composer/installed.php changes, asking for a reconnect. Correct safety posture (dependency drift invalidates an in-flight run), but it adds a failure mode the calling agent must detect and handle rather than treat as generic error.duration_ms / slot_wait_ms fields, abandoned status in pipeline:history and the page.Key questions
onAbort? What is the recovery behaviour for an orphaned slot?open_run "reconnect required" refusal, so the agent harness can distinguish it from a crash?setsid children and grandchildren, and is there an opt-out for deliberately daemonized processes?next_step's status set have a documented, versioned contract?Stack fit
proc/signal capabilities).Migration path
exclusive + missing withResponseWindow (only relevant if slots are already modelled).abandoned is a derived display/state value, but verify it does not rewrite persisted run rows in a way our reporting queries assume.Compatibility
waiting_for_slot, plus abandoned in history). Treat the status set as a versioned enum in our own code before adopting.Sequencing
waiting_for_slot handling, and explicit reconnect handling on open_run refusal.onAbort cleanup hooks before adopting exclusive() — cleanup is the prerequisite for safe contention.exclusive() on a single non-critical named resource at capacity 1, measure slot_wait_ms, then widen.pipeline:history page last.Maintenance
verified-sha marker in release notes is a useful supply-chain signal — keep it in the upgrade checklist.Support
slot_wait_ms and duration_ms in whatever dashboard the team already watches; without it, contention complaints are unanswerable.Scaling
capacity × hosts — either accept that or pick a shared lock backend. Decide this before the first horizontal scale-out, not after.slot_wait_ms p95, not just on failures.Failure modes
onAbort and an explicit post-timeout assertion in the pipeline.composer install runs frequently in the same workspace, e.g. mid-run dependency refresh by another agent.onAbort running a command that itself fails or hangs needs a bounded timeout of its own, or abort handling becomes a second failure.Ramp-up
slot_wait_ms that we do not yet have. Plan one iteration of measurement before setting capacities.How can I help you explore Laravel packages today?