main is red right now, and was red at 8d1e5fd, from a provider returning HTTP error 500 … "Temporary internal error. Please retry" on vm.createSelectFork. Nothing about the repo changed. This recurs — #26's own PR body records base_sepolia answering 408 Request timeout on the free plan, PR #19's CI failed on two chain tests for the same reason, PR #20's on five.
A repo whose default branch reds on provider weather is a repo where red stops meaning anything.
Three things combine to cause it
1. The fork surface is large. 37 createSelectFork calls across three test files on main:
| file |
calls |
test/src/lib/LibRainDeploy.t.sol |
31 |
test/src/abstract/RainDeployVerifyChain.t.sol |
5 |
test/src/abstract/RainDeployVerifyChainCandidate.t.sol |
1 |
2. The fork-free/chain split does not hold where it matters. #26 separated chain-anchored assertions into *Chain* contracts so an unreachable endpoint fails only those, and CLAUDE.md documents forge test --no-match-contract Chain as forking nothing. But LibRainDeployTest is not a Chain contract and holds 31 of the 37 forks — so that documented selection forks 31 times, and an outage fails it. The split is real for the verification abstracts and absent for the library's own suite.
3. Nothing retries. There is no retry or fallback around any createSelectFork in the repo. One transient 500 fails the job.
Many of those forks buy nothing
Some tests fork and then replace everything they touch with vm.etch, reading no chain state at all. testDeployZoltuFailedCallReportsZeroAddress (test/src/lib/LibRainDeploy.t.sol:399) forks Arbitrum, then etches the factory and deploys type(MockDeployable).creationCode — nothing in it depends on the fork. RainDeployVerifyBase.deriveDeployment proves the point by running deployZoltu on a bare local EVM.
testDeployZoltuRevertsWhenFactoryCallFailsWithAddressData (:1133) is a second instance and is also fully subsumed by the test at :399 — same fork, same etch, same call, but asserting only the revert selector where :399 asserts the exact payload. It can be deleted outright.
These are examples, not the list. The category is: a test that etches everything it reads does not need a fork.
Ask
- Audit all 37. Delete the fork from every test that reads no chain state; delete
:1133 entirely.
- Whatever genuinely needs a chain moves into a
*Chain* contract, so --no-match-contract Chain forks nothing, as CLAUDE.md already claims.
- Decide whether the remaining chain tests get a retry around
createSelectFork. Shared CI concern — if the answer is yes, it likely belongs in rainix rather than here.
Ordering matters: (1) and (2) shrink the surface (3) has to cover.
mainis red right now, and was red at8d1e5fd, from a provider returningHTTP error 500 … "Temporary internal error. Please retry"onvm.createSelectFork. Nothing about the repo changed. This recurs — #26's own PR body recordsbase_sepoliaanswering408 Request timeout on the free plan, PR #19's CI failed on two chain tests for the same reason, PR #20's on five.A repo whose default branch reds on provider weather is a repo where red stops meaning anything.
Three things combine to cause it
1. The fork surface is large. 37
createSelectForkcalls across three test files onmain:test/src/lib/LibRainDeploy.t.soltest/src/abstract/RainDeployVerifyChain.t.soltest/src/abstract/RainDeployVerifyChainCandidate.t.sol2. The fork-free/chain split does not hold where it matters. #26 separated chain-anchored assertions into
*Chain*contracts so an unreachable endpoint fails only those, andCLAUDE.mddocumentsforge test --no-match-contract Chainas forking nothing. ButLibRainDeployTestis not aChaincontract and holds 31 of the 37 forks — so that documented selection forks 31 times, and an outage fails it. The split is real for the verification abstracts and absent for the library's own suite.3. Nothing retries. There is no retry or fallback around any
createSelectForkin the repo. One transient 500 fails the job.Many of those forks buy nothing
Some tests fork and then replace everything they touch with
vm.etch, reading no chain state at all.testDeployZoltuFailedCallReportsZeroAddress(test/src/lib/LibRainDeploy.t.sol:399) forks Arbitrum, then etches the factory and deploystype(MockDeployable).creationCode— nothing in it depends on the fork.RainDeployVerifyBase.deriveDeploymentproves the point by runningdeployZoltuon a bare local EVM.testDeployZoltuRevertsWhenFactoryCallFailsWithAddressData(:1133) is a second instance and is also fully subsumed by the test at:399— same fork, same etch, same call, but asserting only the revert selector where:399asserts the exact payload. It can be deleted outright.These are examples, not the list. The category is: a test that etches everything it reads does not need a fork.
Ask
:1133entirely.*Chain*contract, so--no-match-contract Chainforks nothing, asCLAUDE.mdalready claims.createSelectFork. Shared CI concern — if the answer is yes, it likely belongs in rainix rather than here.Ordering matters: (1) and (2) shrink the surface (3) has to cover.