lar-05 reproduction
Public source retained with the related article. Generated results, dependency directories, runtime storage, secrets, and oversized binary artifacts are intentionally excluded.
README
# LAR-05 Octane lifecycle fixture
This fixture compares a fresh Laravel CLI process per request with one real
Laravel Octane RoadRunner worker. The fresh control is not a PHP-FPM benchmark.
The application pins Laravel 13.20.0, Octane 2.17.4, PHP 8.4.12, RoadRunner
2025.1.15, its official image digest, and the RoadRunner PHP bridge. A declared
5,000-iteration SHA-256 loop in `AppServiceProvider::boot()` makes repeated
provider boot work visible. It is synthetic and does not represent an
application used by Brian or a production Laravel workload.
Run the current performance, response-equivalence, state-isolation, and memory
controls with:
```sh
./run.sh
```
The runner builds the pinned image, limits it to two CPUs and 1 GiB of memory,
retains every raw observation in `results/profile.json`, and runs the semantic
verifier. It records three trials at concurrency one and four after declared
warm-ups.
The fixture deliberately contains unsafe warmed singletons next to a scoped
binding and lazy request resolver. The unsafe cases are evidence controls, not
recommended application design.
The lifecycle runner also retains max-request recycling, crash replacement,
request timeout, activation versus reload, an in-flight request, failed
replacement readiness, rollback, and framework locale reset. RoadRunner's
Octane output reports why a worker stopped but not its exit code or signal; the
result records those fields as unobservable instead of inventing values.
The configured `max_jobs` boundary counts worker executions, including health
traffic, and did not act as an exact `/retain` request counter in the observed
run. The retained per-generation counts make that distinction inspectable.
The complete gate also inventories all 83 locked packages and both application
providers, retains 13 primary-source responses, rejects 20 isolated mutations,
records source and result provenance, and stores a clean committed-tree export.
`results/decisions/adoption.json` preserves the score-free adoption record and
the application evidence which this fixture cannot supply.
Retained files
- .dockerignore
- .rr.yaml
- adoption-record.mjs
- app/Providers/AppServiceProvider.php
- app/Support/CapturedConfigState.php
- app/Support/CapturedRequestState.php
- app/Support/LazyRequestState.php
- app/Support/LifecycleTelemetry.php
- app/Support/MutableTenantState.php
- app/Support/ScopedRequestState.php
- app/Support/StaticRetention.php
- artisan
- bin/check-release.php
- bin/fresh-request.php
- bin/run-clean-export.sh
- bin/verify-smoke.php
- bootstrap/app.php
- bootstrap/providers.php
- compatibility.mjs
- composer.json
- composer.lock
- config/app.php
- config/cache.php
- config/logging.php
- config/octane.php
- config/session.php
- Dockerfile
- lib/manifest.mjs
- lib/validate-evidence.mjs
- lib/validate-lifecycle.mjs
- lib/validate-report.mjs
- lifecycle.mjs
- mutate.mjs
- primary-sources.json
- profile.mjs
- public/index.php
- README.md
- release.txt
- routes/console.php
- routes/web.php
- run.sh
- smoke.sh
- source-evidence.mjs
- source-manifest.mjs
- verify-results.mjs
- verify.mjs