fix(deploy): bump PHP runtime to 8.4 for heroku-26 - #169
Conversation
heroku-26 dropped PHP 8.3 — offered runtimes are 8.4.20–8.4.24 and 8.5.x — so the ~8.3.0 pin made the PHP buildpack reject the push and blocked the cutover. Bump composer.json and regenerate composer.lock against platform php ~8.4.0 (both files must agree: Heroku reads both), bump the CI shim-lint to 8.4, and update docs/deploy.md. index.php is a plain strict-types front controller and lints clean on PHP 8.4.24.
There was a problem hiding this comment.
Obvious Code Review
Verdict: COMMENT — no findings, clean pass.
Reviewed the canonical patch (4 files, +15/−12): PHP runtime pin bump 8.3 → 8.4 across composer.json, composer.lock, the CI shim job, and docs/deploy.md.
Verified beyond the diff:
- Lock integrity: recomputed Composer's
content-hashfor the newcomposer.json—fdec3e82…matches the committedcomposer.lockbyte-for-byte (method cross-checked against master's~8.3.0hash). Heroku'scomposer installlock validation will pass. - No stale pins: the only remaining
8.3hits on the branch are React18.3.1version strings and the intentional "why not 8.3" rationale indocs/deploy.md. - CI/production parity:
php -l index.phpnow runs on 8.4, the same line the buildpack resolves.
One unverifiable-from-here item: the heroku-26 runtime catalog (8.4.20–8.4.24, 8.5.x) could not be fetched from the sandbox. The claim is coherent with PHP 8.3's Dec 2025 EOL, and its failure mode is a loud buildpack rejection at push — not a silent misconfiguration.
|
Thanks — lock content-hash cross-check noted. On the runtime catalog: it was observed live, not asserted — the heroku-26 buildpack rejected the cutover push for the ~8.3.0 pin, and the runtime list (8.4.20–8.4.24, 8.5.x) is what the rejection/catalog offered. The push-rejection failure mode is exactly why this lands as a mechanical bump first. Merging now so the cutover push can go. |
Why
The production cutover is blocked: the Heroku push fails because the heroku-26 stack no longer offers PHP 8.3 — available runtimes are 8.4.20–8.4.24 and 8.5.x only. The committed
composer.json/composer.lockrequirephp ~8.3.0, so the PHP buildpack cannot resolve a runtime and rejects the push. David is waiting to push the cutover.What
composer.json:~8.3.0→~8.4.0.composer.lockregenerated against platform php~8.4.0(platform-only lock, no packages). Both files agree — Heroku reads both and rejects a mismatch..github/workflows/ci.yml: shim lintphp-version8.3 → 8.4, keeping CI on the same runtime the production build resolves.docs/deploy.md: all PHP version mentions updated, plus a note that 8.4 is the lowest runtime heroku-26 offers (so a future reader doesn't "downgrade" it back).Tradeoffs
8.5 would also resolve on heroku-26; 8.4 is chosen as the lowest offered runtime (oldest supported minor, widest patch range 8.4.20–8.4.24). Rejected: dropping the require section — it loosens the pin and changes the fallback story already documented.
How to Review
4 files, mechanical version bump.
index.phpis a plain strict-types front controller — no 8.3-only constructs;php -lpasses on PHP 8.4.24 (a real heroku-26 runtime) and the full redirect-table shim passes locally.Verification
composer validateclean; composer.lock platform php reads~8.4.0, matching composer.json.php -l index.phpclean on PHP 8.4.24;.github/scripts/verify-shim.shall redirect-table checks passed.🔗 Obvious Project · 🧵 Obvious Thread