The Game Panel specification

ADR-0015: Dependencies are locked and Composer is pinned

Context

composer.lock is gitignored, and every CI job runs composer self-update && composer install && composer dump-autoload. Each run resolves dependencies fresh, against a Composer binary that also moves. A transitive release can turn the build red overnight with no local change, and PHPStan or php-cs-fixer can behave differently in CI than they do locally.

Committing the lock file is the standard, recommended practice for a project: everyone who sets up the project, CI included, then runs on exactly the same dependency versions.

Decision

composer.lock is committed, and CI installs from it with composer install --no-interaction --no-progress. CI runs a pinned Composer version, matching the one used locally, and the pin is changed deliberately.

Alternatives

Resolving dependencies fresh on every CI run, with the lock file ignored and Composer self-updated. It lets builds break with no local change, and lets tools behave differently in CI than locally.

No other arrangement was weighed.

Consequences

Easier:

Harder:

Constrained:

Sources