-
Notifications
You must be signed in to change notification settings - Fork 4.1k
refactor(cosmovisor)!: re-implement core logic to address reliability issues #24821
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from 99 commits
09fe843
4087e2b
5689795
c489524
2277ffb
f0f5caf
3f628b9
19858b3
496bba8
fc37590
14124ea
7177cbb
37f7c9f
5a01495
71c03a9
37ae97a
4745c63
ddc0e33
4953995
522f5a4
5622f47
07545e8
090cdfa
869406b
20fb950
0681722
3100d72
d9ec079
489b234
be564e6
cc3082f
b7c813f
8e83e45
ac2e934
a53bc4d
b1b7eb4
291e00f
9445e42
c700952
6a2f118
cc0bbe6
f0dac99
100f756
68644ad
0b87586
427c526
bd0c895
5a03e7c
638c317
990aeaf
16e7a4b
fba2bac
6cd1227
54d625b
cb624f8
d0d6e66
d9affb9
94675f9
83ef052
c9d0e11
7b128d2
b429d86
7d3c0a3
7a6ece7
85b75bd
06f8c53
f971fa2
e595bb9
947c5f8
e1ccecc
8cbf93b
822be0e
8ec6925
f9f5c62
e4e3feb
41be9b0
2ffffde
f190de8
896202f
1e7cc72
2577a32
3175579
b8a4948
36fe230
2b82656
0c5ad53
0d07bce
9cbc260
f93a7cb
c9fb18f
1aac5d1
03e7c72
7d2d1c6
726288e
7cd0292
b7721c8
28e2e68
9cd07c0
3122f9e
c0efa1d
53032d4
2b3a5d7
42fb734
1ffada5
1ea885b
c005143
1cf11cd
0183068
61ad5e9
f08259a
dfbcffd
9113c9d
49f0ea7
be003aa
e2b2fce
03c5cac
857e809
a92aba1
0fac9ff
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,180 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| //go:build system_test | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| package systemtests | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "fmt" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "os" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "path/filepath" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "regexp" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "testing" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "time" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "github.com/stretchr/testify/require" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "github.com/tidwall/gjson" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| systest "cosmossdk.io/systemtests" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Check failure on line 16 in tests/systemtests/cosmovisor_test.go
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| sdk "github.com/cosmos/cosmos-sdk/types" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "github.com/cosmos/cosmos-sdk/types/address" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| func TestCosmovisorUpgrade(t *testing.T) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| t.Run("gov upgrade, then manual upgrade", func(t *testing.T) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| const ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| upgrade1Height = 25 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| upgrade1Name = "v053-to-v054" // must match UpgradeName in simapp/upgrades.go | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| upgrade2Height int64 = 30 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| upgrade2Name = "manual1" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| // Scenario: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| // start a legacy chain with some state | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| // when a chain upgrade proposal is executed | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| // then the chain upgrades successfully | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| systest.Sut.StopChain() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| currentBranchBinary := systest.Sut.ExecBinary() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| legacyBinary := systest.WorkDir + "/binaries/v0.53/simd" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| systest.Sut.SetExecBinary(legacyBinary) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| systest.Sut.SetupChain() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| votingPeriod := 5 * time.Second // enough time to vote | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| systest.Sut.ModifyGenesisJSON(t, systest.SetGovVotingPeriod(t, votingPeriod)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| systest.Sut.StartChainWithCosmovisor(t) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| cli := systest.NewCLIWrapper(t, systest.Sut, systest.Verbose) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| govAddr := sdk.AccAddress(address.Module("gov")).String() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| // submit upgrade proposal | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| proposal := fmt.Sprintf(` | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "messages": [ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "@type": "/cosmos.upgrade.v1beta1.MsgSoftwareUpgrade", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "authority": %q, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "plan": { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "name": %q, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "height": "%d" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "metadata": "ipfs://CID", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "deposit": "100000000stake", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "title": "my upgrade", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "summary": "testing" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }`, govAddr, upgrade1Name, upgrade1Height) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| proposalID := cli.SubmitAndVoteGovProposal(proposal) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| // add binary for gov upgrade | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| systest.Sut.ExecCosmovisor( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| t, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| true, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "add-upgrade", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| upgrade1Name, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| currentBranchBinary, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+76
to
+83
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Add validation after adding the upgrade binary. The test doesn't verify that the upgrade binary was successfully added to Cosmovisor. This could lead to silent failures. // add binary for gov upgrade
systest.Sut.ExecCosmovisor(
t,
- true,
+ false, // run synchronously to check for errors
"add-upgrade",
upgrade1Name,
currentBranchBinary,
)
+// Verify the upgrade was added
+upgradePath := filepath.Join(systest.WorkDir, systest.Sut.NodeDir(0), "cosmovisor", "upgrades", upgrade1Name, "bin")
+_, err := os.Stat(upgradePath)
+require.NoError(t, err, "upgrade binary should exist after add-upgrade")📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| requireCurrentPointsTo(t, "genesis") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| systest.Sut.AwaitBlockHeight(t, 21, 60*time.Second) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| t.Logf("current_height: %d\n", systest.Sut.CurrentHeight()) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| raw := cli.CustomQuery("q", "gov", "proposal", proposalID) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| proposalStatus := gjson.Get(raw, "proposal.status").String() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| require.Equal(t, "PROPOSAL_STATUS_PASSED", proposalStatus, raw) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| // add manual upgrade | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| systest.Sut.ExecCosmovisor( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| t, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| true, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "add-upgrade", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| upgrade2Name, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| currentBranchBinary, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| fmt.Sprintf("--upgrade-height=%d", upgrade2Height), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| systest.Sut.AwaitBlockHeight(t, upgrade1Height+1) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| requireCurrentPointsTo(t, fmt.Sprintf("upgrades/%s", upgrade1Name)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| // make sure a gov upgrade was triggered | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| regex, err := regexp.Compile(fmt.Sprintf(`UPGRADE %q NEEDED at height: %d: module=x/upgrade`, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| upgrade1Name, upgrade1Height)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| require.NoError(t, err) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| require.Equal(t, systest.Sut.NodesCount(), systest.Sut.FindLogMessage(regex)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| // make sure the upgrade-info.json was readable by nodes when they restarted | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| regex, err = regexp.Compile("read upgrade info from disk") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| require.NoError(t, err) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| require.Equal(t, systest.Sut.NodesCount(), systest.Sut.FindLogMessage(regex)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| systest.Sut.AwaitBlockHeight(t, upgrade2Height+1) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| requireCurrentPointsTo(t, fmt.Sprintf("upgrades/%s", upgrade2Name)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| // smoke test that new version runs | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| cli = systest.NewCLIWrapper(t, systest.Sut, systest.Verbose) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| got := cli.Run("tx", "protocolpool", "fund-community-pool", "100stake", "--from=node0") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| systest.RequireTxSuccess(t, got) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| t.Run("manual upgrade", func(t *testing.T) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| const ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| upgradeHeight = 10 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| upgradeName = "v053-to-v054" // must match UpgradeName in simapp/upgrades.go | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| // Scenario: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| // start a legacy chain with some state | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| // when a chain upgrade proposal is executed | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| // then the chain upgrades successfully | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| systest.Sut.StopChain() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| currentBranchBinary := systest.Sut.ExecBinary() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| legacyBinary := systest.WorkDir + "/binaries/v0.53/simd" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| systest.Sut.SetExecBinary(legacyBinary) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| systest.Sut.SetupChain() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| systest.Sut.StartChainWithCosmovisor(t) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| requireCurrentPointsTo(t, "genesis") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| // we create a wrapper for the current branch binary which sets the | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| // SIMAPP_MANUAL_UPGRADE_HEIGHT which will cause the upgrade to be applied manually | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| wrapperTxt := fmt.Sprintf(`#!/usr/bin/env bash | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| set -e | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| SIMAPP_MANUAL_UPGRADE_HEIGHT="%d" exec %s "$@"`, upgradeHeight, currentBranchBinary) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| wrapperPath := filepath.Join(systest.WorkDir, "testnet", fmt.Sprintf("%s.sh", upgradeName)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| wrapperPath, err := filepath.Abs(wrapperPath) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| require.NoError(t, err, "failed to get absolute path for manual upgrade script") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| err = os.WriteFile(wrapperPath, []byte(wrapperTxt), 0o755) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Check failure on line 148 in tests/systemtests/cosmovisor_test.go
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| require.NoError(t, err, "failed to write manual upgrade script") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| // schedule manual upgrade to latest version | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| systest.Sut.ExecCosmovisor( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| t, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| true, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "add-upgrade", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| upgradeName, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| wrapperPath, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| fmt.Sprintf("--upgrade-height=%d", upgradeHeight), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| systest.Sut.AwaitBlockHeight(t, upgradeHeight+1, 60*time.Second) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| requireCurrentPointsTo(t, fmt.Sprintf("upgrades/%s", upgradeName)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| // smoke test that new version runs | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| cli := systest.NewCLIWrapper(t, systest.Sut, systest.Verbose) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| got := cli.Run("tx", "protocolpool", "fund-community-pool", "100stake", "--from=node0") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| systest.RequireTxSuccess(t, got) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| func requireCurrentPointsTo(t *testing.T, expected string) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| t.Helper() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| for i := 0; i < systest.Sut.NodesCount(); i++ { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| curSymLink := filepath.Join(systest.Sut.NodeDir(i), "cosmovisor", "current") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| resolved, err := os.Readlink(curSymLink) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| require.NoError(t, err, "failed to read current symlink for node %d", i) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| require.Equal(t, expected, resolved, "current symlink for node %d does not point to expected directory", i) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
💡 Verification agent
🧩 Analysis chain
Build targets look good, but investigate system test failures.
The new build targets are well-structured and properly handle binary preparation for system tests. However, there's a pipeline failure mentioned for system tests.
Run the following script to investigate the system test failures:
🏁 Script executed:
Length of output: 493
Fix
build-system-testto include current branch binariesThe
test-systemtarget depends onbuild-system-test, which only invokesbuild-v53and never creates the roottests/systemtests/binaries/directory or copies the current branchsimdandcosmovisorbinaries. As your verification showed, thebinaries/folder is missing, causing system tests to fail.· Makefile (lines 508–522): update
build-system-testdependencies· Ensure both current and v0.53 binaries are prepared before running tests
Proposed diff:
This change makes
build-system-testfirst runbuild-system-test-current(creatingbinaries/and copyingsimd&cosmovisor), then produce the v0.53 binary, so all tests have the expected binaries available.🧰 Tools
🪛 GitHub Actions: System Tests
[error] Make target 'test-system' failed with exit code 2 due to system test failures.
🤖 Prompt for AI Agents