fix(simulation): BondYield-ChurnOut race and misleading thornode-unreachable failures

What

  • test/simulation/actors/features/bond_yield.go: BondYield-ChurnOut records the target node's status_since when it submits the leave, and treats any later change as the churn-out. Covered by a new unit test.
  • .gitlab-ci.yml (test-simulation after_script): run make test-simulation-events only while docker-thornode-1 is running. Otherwise print the container's status, exit code and OOM flag.

Why

These are two of the three test-simulation failures still flaking on MR pipelines in October 2026.

BondYield-ChurnOut (17 failures in October). Churning a node out clears its leave request, and the sim's ChurnInterval is 55 blocks. So the next churn could make the target Ready and then Active again before the actor ever saw Standby (job 17244699867). The other October failures were:

  • 2 from a production churn bug, fixed separately in !5237 (merged);
  • 15 from vault migrations that never finished: XMR FROST signing (#3384), the mocknet ZEC expiry window during churn, and XRP/TSS signing. These are not fixed here.

"thornode unreachable". All 270 such jobs since June had already failed earlier, in one of these ways:

  • mocknet build or startup;
  • image pulls;
  • DNS during the genesis contract deploy;
  • sim setup readiness;
  • actor errors with no actor= field.

The after_script's thorscan then reported thornode as unreachable, which hid the real cause and showed up as a separate flake. None of those jobs showed a thornode crash, panic or OOM.

The third active flake, InactiveVaultRefund-BTC, was already fixed by !5169 (merged).

Testing

  • New bond_yield_test.go case.
  • glab ci lint passes. The after_script snippet was exercised against missing, running and exited containers.

🤖 Generated with Claude Code

Merge request reports

Loading
Loading