Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Laravel Runabout Laravel Package

vusys/laravel-runabout

Runabout is journey testing for Laravel: define the steps of a user journey once, and it executes them in randomised-but-deterministic orders, checking your invariants after every step to catch bugs.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit. Runabout is a dev-only testing library, not a runtime dependency. It ships as a trait (RunsJourneys) you mix into an existing PHPUnit test case, with no service provider to register and nothing to publish. That means the integration surface is a single Composer require --dev line plus new test files — it does not touch application bootstrapping, config, or deployment. For a TPM this is the most attractive property of the package: it is additive, isolated to the test suite, and reversible in an afternoon.

The conceptual model is also well-matched to a class of defects that most Laravel suites structurally cannot catch: order-dependent bugs in stateful workflows. Fixed-path feature tests assert one happy sequence; unit tests assert one unit. Runabout asserts invariants after every step across many seeded orderings, which maps directly onto domains where ordering matters — billing and quota accounting, multi-tenant session scoping, approval/workflow state machines, inventory reservation, retry and rollback paths. The invariant library is opinionated in a useful way (legalTransitions(), uniqueBy(), quotaBalances() with per-row starting allowances), which suggests the author understands the problem domain rather than having built a generic fuzzer.

Integration feasibility. Low-to-moderate. The blockers are environmental, not architectural:

  • PHP 8.3+ and Laravel 11/12/13 only. Any team still on Laravel 10 or PHP 8.2 is excluded outright. This must be checked against the fleet baseline before any evaluation spend — it is the single largest go/no-go gate.
  • PHPUnit-first. The README examples are PHPUnit test cases. Pest compatibility is not documented and should be treated as unknown until verified; if the org standardises on Pest, add a spike task.
  • Invariants are authored, not discovered. The tool amplifies the quality of the invariants you write. A team that writes vague invariants gets noise; a team that writes none gets twenty-six green runs and false confidence. The value is entirely gated on domain understanding.

Technical risk. The dominant risk is not code quality — the repository shows PHPStan level 9, Rector, Pint, mutation testing via Stryker, OpenSSF Scorecard, Bencher performance tracking, a CI matrix, and seventeen documentation pages. That is a stronger internal-engineering signal than most 0.x packages ever produce. The risk is social and lifecycle:

  • 0 stars, 0 dependents, 0.x versioning. There is no field validation. Nobody else has run this against a production Laravel codebase, which means the failure modes you hit will be ones the author has not seen. MIT licensing plus the trait-only design mitigates abandonment risk substantially — worst case, you fork or delete.
  • Sole-maintainer bus factor. No evidence of a contributor base. Assume a fork-and-maintain contingency and price it in.
  • Seed schema is a compatibility surface. The changelog is explicit that seed derivation changed between schema versions and that pinned RUNABOUT_SEED values re-keyed as a result. Any pinned seeds or RUNABOUT_TRAIL artifacts stored in CI will silently stop reproducing the same trail across upgrades. This is a real operational hazard and needs a policy (see below).
  • Metadata anomaly. The listed last release date is in the future relative to normal release cadence. Treat the release metadata as unreliable and verify the actual tag history on the repository before relying on any maturity claim.

Key questions.

  1. What is the org's PHP/Laravel version distribution, and what percentage of the fleet can actually install this today?
  2. Does the maintainer have a stated support policy for 0.x, and is a 1.0 with a frozen seed schema on the roadmap?
  3. Is Pest supported, and is there an Artisan-facing runner or is it strictly PHPUnit-trait-based?
  4. How does the package behave with queued jobs, events, and external services — does resetExternal() cover async side effects, or do we need to disable queues in journey runs?
  5. What is the wall-clock cost of shuffles(25) against a realistic journey on our schema, and does runtime scale linearly or super-linearly with journey length?
  6. Has anyone outside the author ever run this against a non-trivial application?

Integration Approach

Stack fit. Best fit is a Laravel 11+ monolith or modular monolith with a mature PHPUnit suite and a domain that has genuine state machines and cross-actor interactions. Poor fit for a thin CRUD service (no ordering bugs to find), a Laravel 10 codebase (incompatible), or a team with no appetite for authoring invariants.

The package's feature set maps to specific adoption triggers rather than blanket rollout:

Trigger Relevant capability
Multi-tenant / session-scoped bugs Journey::actors(), Actor::withSession(), per-actor session data through full middleware
Quota, credit, or balance accounting Invariants::quotaBalances() with per-row closures
State machines / approval workflows Invariants::legalTransitions(), Invariant::fromStart()
Deduplication / unique-key regressions Invariants::uniqueBy()
Time-dependent logic Time travel step support
Cross-entity interleaving Interleaving journeys, round-robin canonical order

Migration path. There is no migration. Existing tests stay exactly as they are; Runabout is additive coverage in new test classes. Removal is composer remove --dev vusys/laravel-runabout plus deleting the journey test files. This asymmetry — cheap to try, cheap to abandon — is the core argument for a timeboxed spike rather than an architecture review.

Compatibility. Two axes:

  • Framework: PHP 8.3, Laravel 11/12/13. Pin the Composer constraint to a specific minor (e.g. ^0.2) and treat minor bumps as requiring a seed-artifact refresh.
  • Test-suite: coexists with PHPUnit; run journeys as a separate test suite / separate CI job rather than folding them into the main suite. This preserves the fast PR feedback loop and lets you run higher shuffle counts on a nightly schedule.

Sequencing.

  1. Week 0 — Gate check. Confirm PHP/Laravel baseline, confirm PHPUnit vs Pest, confirm CI budget for an additional job. Stop here if the version gate fails.
  2. Week 1–2 — Timeboxed spike. Pick one high-value stateful domain. One named champion writes 2–3 journeys, a handful of real invariants, and runs shuffles(25) in a non-blocking CI job. Deliverable: bugs found (if any), wall-clock cost, developer experience notes.
  3. Week 3 — Evaluate. Did it find a real ordering bug that existing tests missed? That is the only metric that matters for the go decision. If zero bugs across three journeys in a genuinely stateful domain, the domain was wrong or the invariants were too weak — retry once before parking.
  4. Week 4+ — Conditional adopt. If go: add a nightly job at higher shuffle counts, wire RUNABOUT_TRAIL artifact upload on failure so any engineer can replay the exact failing sequence locally, and document a seed-pinning policy (see Operational Impact). If no-go: remove the dependency and record the finding; the spike cost was two weeks.
  5. Ongoing — Expand by trigger, not by mandate. Add journeys where a production ordering bug has actually occurred. Retroactive journey-writing after an incident is a far stronger forcing function than a coverage mandate.

A useful TPM framing for stakeholders: this is a regression harness for a bug class, not a coverage-percentage tool. Success is measured in escaped ordering defects prevented, not lines covered.

Operational Impact

Maintenance. Low runtime footprint, moderate authoring footprint. Nothing runs in production; no config, no migrations, no provider. The ongoing cost is the invariant and journey corpus: journeys that reference models, state machines, or tenancy semantics will drift as the domain evolves, and a stale journey can become a false-negative generator (green because the invariant no longer describes reality). Budget a quarterly review of the journey corpus alongside the test-suite health check.

The seed-schema risk requires an explicit policy. Recommended: do not pin RUNABOUT_SEED in committed config. Rely on seeds only as a failure artifact — captured from CI output on a red run, replayed locally and immediately converted into a deterministic regression test or a written invariant. This makes seed-schema changes a non-event and matches the package's own design intent (reproduce, then fix).

Support. This is the weakest dimension. Zero dependents means no community answers, no Stack Overflow corpus, no third-party tutorials. Every question routes to the maintainer or to reading the source. The mitigation is documentation quality, which is genuinely strong — seventeen topic pages covering concepts, execution modes, reproducing failures, observability, and environment variables. A champion can self-serve; a team cannot. Designate an internal owner. Do not adopt this with the expectation that any engineer can pick it up cold.

Also flag the maintenance-concentration risk formally: record the fork contingency (MIT, source available, no runtime coupling) in the adoption decision so it is a known and accepted risk rather than a surprise.

Scaling. Two distinct scaling concerns:

  • Test runtime. shuffles(25) produces 26 executions of a journey. Cost is O(journeys × shuffles × steps), plus shrinking overhead on failure — capped by default at 200 candidate replays (RUNABOUT_SHRINK_BUDGET). On a large schema this will not fit in a PR pipeline. The right structure is a tiered schedule: a small shuffle count (3–5) on PRs for fast signal, a high shuffle count nightly or pre-release for depth. This is a configuration decision the TPM should make explicitly, not leave to individual authors.
  • Combinatorial coverage. Shuffled ordering samples the space; it does not exhaust it. exhaustive mode exists but will not scale beyond short journeys. Set expectations accordingly — this raises confidence in ordering correctness, it does not prove it.

Failure modes to plan for.

Failure mode Symptom Mitigation
Weak/absent invariants Runs green, catches nothing Invariant review as part of journey PR; mandate at least one state invariant per journey
State leakage between trails Order-dependent flake, contradicting the tool's premise Explicit multi-connection resetConnections() and resetExternal() for queues/caches/external stores; verify isolation first
Seed re-keying on upgrade Pinned artifacts stop reproducing Never commit seeds; artifact-on-failure only
0.x breaking changes Namespace or DSL churn Pin minor version; read changelogs (they are detailed and honest about breakage) before bumping
Runtime creep in CI PR pipeline slows, engineers route around it Tiered shuffle schedule; separate CI job; hard budget on journey count
Maintainer abandonment No upstream fixes Fork contingency documented; removal is cheap
"God journeys" Slow, brittle, hard to debug Authoring guidelines: one journey per lifecycle, named steps, constraints via when()/after()
Real bugs surfaced post-adoption Unexpected backlog of ordering defects Frame the spike as a discovery exercise; budget remediation capacity before the nightly job goes live

Ramp-up. Expect a one-to-two sprint curve for the champion and roughly a day for additional engineers once exemplar journeys exist. The DSL itself is small; the difficulty is the conceptual shift — thinking in invariants and constraints rather than assertions and fixtures. Accelerants: the quick-start guide is a complete worked example, and the concepts and execution-modes pages are short. The most effective onboarding asset you can build is one internal exemplar journey in your own domain, written by the champion, reviewed by a domain expert for invariant correctness. That single artifact does more for adoption than any amount of upstream documentation.

Overall TPM position. High technical quality, low adoption evidence, near-zero integration cost, near-zero removal cost. That combination justifies a timeboxed evaluation, not an endorsement. Approve a two-week spike against one stateful domain, gate continuation on finding at least one real ordering defect, and make the go decision on that evidence rather than on the repository's engineering signals — impressive as they are, they measure how the package is built, not whether it works on your codebase.

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
oxygen/data
oxygen/core
jengo/base
xiloryx/log-collector
a21ns1g4ts/filament-stripe
la-php/laravel-admin
artisan-build/community-prompts
vleroy/smart
ayles-software/laravel-australian-public-holidays
cboxdk/laravel-id-spatie
cboxdk/laravel-id-billing
cboxdk/laravel-id-billing-bridge
simple-as-fuck/php-performance-log
hsluv/hsluv
seampact/codegen
seampact/hooks
seampact/ir
mehedimi/laravel-amp-mail
happones/laravel-vue-i18n-generator
jwerd/inertia-table