ci: unrot the Windows PHP download and make PRs run the same matrix as master - #362
Conversation
build-master has failed on every push since 2026-07-30, and the two merges today were not the cause. The Windows job downloads PHP from a URL pinning the exact patch, under downloads.php.net/~windows/releases/. That directory only keeps the current patch of each branch. Once 8.4.24 shipped, php-8.4.23-Win32-vs17-x64.zip started returning 404 and the job died in setup, before running a single test. 8.1.34 still resolves today, which is the only reason that job stayed green; it would have rotted the same way on the next 8.1 patch. Both URLs now point at windows.php.net/downloads/releases/archives/, which keeps every patch. Verified both return the file. Bumping the patch becomes a deliberate manual step rather than a time bomb. Second half of the problem: build-pull-request ran ubuntu-latest only, so no PR could ever exercise Windows and this break was undiscoverable until master was already red. It also installed the distro default PHP for both matrix entries, ignoring php-version, so its 8.1 and 8.4 jobs were testing the same interpreter. build-pull-request is now generated from build-master and differs only in the trigger: same matrix, same setup steps, same checks. Master's Release-commit guard is dropped, having no meaning on a pull request. No new secrets or workflow variables.
🔴 Risk Classification: MAJORApproval route: AI Review + Human Approval Required Classification reasons
Operational gates
Files analysed: 2 wall-e 2026.06.19-02 · policy |
🔬 Debug — why this classification?Each reason code emitted by the classifier, its source clause in the AI in SDLC Control Framework, and what it means.
Kinds:
See issue #3 for the proposal to formalise this map as Appendix A of the standards doc. wall-e 2026.06.19-02 · debug |
Follows the review bot on #362. SonarCloud flagged "executing downloaded artifacts without verification" on the PHP and Composer downloads. The finding only appeared because copying the setup block into build-pull-request.yml made it new code, but it is a fair point about code that runs with repository secrets, so it is fixed rather than sidestepped. Verification, all three downloads: PHP zip pinned SHA-256 per version, checked before Expand-Archive. php.net publishes no checksum next to these archives, so the hashes were computed from the official download: that buys integrity, not independent provenance, and the comment says so rather than overclaiming. Composer (Windows) pinned to 2.10.2 and checked against the SHA-256 that getcomposer.org publishes for that exact version. composer-stable.phar was a moving target and could not be checksummed at all. Composer (Ubuntu) the installer was piped straight from curl into php. It is now verified against composer.github.io/installer.sig first, which is the check Composer's own docs prescribe. Any mismatch throws with both hashes in the message, so a future patch bump fails loudly instead of silently running something else. Second change, and the reason the duplication existed: build-pull-request.yml is now a 20-line caller of build-master.yml via workflow_call, instead of a copy. One definition, so the two cannot drift again, and the download block is not duplicated. The Release-commit guard is now conditioned on github.event_name == 'push', since a pull request has no github.event.commits to test.
|
Updated after the SonarCloud finding, and the finding is fixed rather than sidestepped. Why it appeared: copying the setup block into
A mismatch throws with both hashes in the message, so a future patch bump fails loudly instead of quietly running something else. And the duplication is gone. Previous run of this PR did prove the point: |
🔴 Risk Classification: MAJORApproval route: AI Review + Human Approval Required Classification reasons
Operational gates
Files analysed: 2 wall-e 2026.06.19-02 · policy |
🔬 Debug — why this classification?Each reason code emitted by the classifier, its source clause in the AI in SDLC Control Framework, and what it means.
Kinds:
See issue #3 for the proposal to formalise this map as Appendix A of the standards doc. wall-e 2026.06.19-02 · debug |
🔵 Advisory review: Sound, but needs your judgementThis PR needs a human approval. The code itself reads as correct; whether it should land depends on context I don't have. The PR fixes a rotting Windows PHP download URL, adds integrity checks for both PHP and Composer, and unifies the PR/master CI matrix via workflow_call — all of which look correct. The main judgement call is accepting SHA-256 hashes that were self-computed by the author against the official downloads (no independent provenance), and confirming that For you to decide
This is not an approval. wall-e cannot auto-approve this PR — it is an opinion to help whoever does. Advisory review · us.anthropic.claude-sonnet-4-6 · wall-e 2026.06.19-02 |
|
- Add InstrumentDocumentType with bank_statement for bank account payment instrument documents (#360) - Model the onboarding bank_verification, articles_of_association and shareholder_structure documents as their own classes with their own type constants, instead of the generic Document whose docblock pointed at the identity DocumentType (#361) - Revert build-master.yml to push-only with its original release guard, and build-pull-request.yml to its pre-#362 content; from #362 only the archive download URLs and the checksum verification remain, which is what fixed the 404



Why
build-masterhas failed on every push since 2026-07-30. The two merges earlier today were not the cause; they just made it visible.The Windows job downloads PHP from a URL pinning the exact patch:
That directory only keeps the current patch of each branch. Once 8.4.24 shipped, this URL began returning
404and the job died during setup, before running a single test:8.1.34still resolves today, which is the only reason that job stayed green. It would have rotted the same way on the next 8.1 patch.Fix 1 — a URL that does not rot
Both downloads now point at
windows.php.net/downloads/releases/archives/, which keeps every patch ever published. Verified both files return successfully.Bumping the PHP patch becomes a deliberate manual edit rather than a time bomb that fires whenever upstream releases.
Fix 2 — PRs run the same matrix as master
The reason nobody caught this:
build-pull-requestranubuntu-latestonly. No pull request could exercise Windows, so a Windows-only break was undiscoverable until master was already red.While aligning the two I found a second problem: the PR workflow installed the distro default PHP for both matrix entries, ignoring
php-version. Its8.1and8.4jobs were testing the same interpreter, so the matrix was reporting coverage it did not have.build-pull-request.ymlis now generated frombuild-master.ymland differs only in the trigger: same OS and PHP matrix, same setup steps, same checks. Master's Release-commit guard is dropped, having no meaning on a pull request.Note
No new secrets or workflow variables.
This PR is itself the test of fix 2: its own checks should now include
windows-lateston 8.1 and 8.4, which no previous PR in this repo has run.