Founder Stories

Exit Code Zero: Eight Checks That Said Everything Was Fine

Eight checks said a benchmark run was fine. Each was wrong. Our engineering lesson: verify the real postcondition, not the reassuring status line.

RTD

RTD Team

Run-True Decision

Exit Code Zero: Eight Checks That Said Everything Was Fine

We set out to repeat a benchmark. It should have been routine: rebuild the same environment, run the same protocol, and compare the result with the earlier baseline.

The new result came back materially below the earlier range. The obvious story was that recent changes to the application had introduced a regression.

That story was wrong.

Before we found the right explanation, we reached three confident conclusions that did not survive the next experiment. More importantly, eight separate checks reported success or a state that was not true.

Here is what happened, in order, including the parts where we were wrong.

Eight checks that were not checking what they claimed

# What the check reported What was actually true
1 An HTTP probe returned 000, so the cluster appeared dead The probe used the wrong port, the wrong protocol (plain HTTP instead of TLS), and no client certificate. The mTLS services were healthy
2 The benchmark exited 0 It wrote no result data because the load generator was missing its benchmark script
3 The benchmark exited 0 again Every request was rejected with HTTP 429
4 The deployment printed “Deploy done” The deployment had partially failed and the required database had not been created
5 A preflight step said it prevented a known package problem It removed one half of the package configuration while leaving the other half behind, causing the package update to fail
6 A wait loop said the process was still running The process had stopped; the search matched the wait loop’s own command line
7 A new safety gate was described as enforced in code The caller could supply a partial node list and make the gate pass without checking the full dependency path
8 The run produced its strongest headline result of the session Every request behind that result was an error

None of these failures came from the Fraud Decision Engine being measured. They came from the scripts, probes, and status lines that were supposed to tell us whether the measurement was valid.

That distinction mattered here. The broken checks admitted invalid evidence and then made that evidence look trustworthy.

Wrong conclusion one: one slow node explained the gap

We isolated the engine nodes and found one that was materially slower than its peers. A small arithmetic probe, with no application code or network involved, confirmed that the difference was real.

The slow node also entered the pool at the point where scaling stopped improving. The story fit neatly: one weak machine had pulled down the cluster result.

We nearly stopped there.

Instead, we rebuilt the environment with a fleet that passed the new parity check and repeated the benchmark. The result did not recover. It moved further away from the earlier range.

The slow node was real. The explanation built around it was not.

That follow-up challenge was the turning point. It showed how a conclusion can be supported by genuine measurements and still be wrong. The measurements established that one node was slow. They did not establish that the node caused the benchmark gap.

Wrong conclusion two: the load generator was saturated

The next suspect was the machine producing the traffic. If it had reached its own capacity, adding more engines would not improve the result.

But the load generator was mostly idle. So was the load balancer. The engines were not fully occupied either.

The constrained component was the database. Under load, it was saturated while the rest of the system waited. A CPU probe then showed that the database machine was also materially slower per core than the surrounding nodes.

This explained the observed ceiling, but it still did not tell us why nominally similar infrastructure behaved so differently.

Wrong conclusion three: the variance was outside the infrastructure contract

By then we had repeated evidence of large variation between instances that appeared similar from inside the guest operating system. We assembled what looked like a strong provider case.

Before filing it, we read the provider’s specification.

The documented behavior matched what we had observed. That infrastructure family can be placed on different underlying server platforms, and its performance may vary between those platforms. The provider also recommends a different family when consistent performance is required.

Our strongest-looking evidence—that the machines reported the same generic CPU identity—did not prove that the underlying hardware was the same. The uniform identity was part of the virtualization contract, not a hardware inventory.

There was no provider fault to allege. We had selected the wrong instrument for a consistency-sensitive measurement, and the limitation was documented in advance.

The engine was fine

We moved both the database and load-generator roles to hardware intended for consistent performance and repeated the diagnostic run. The benchmark returned to its prior range.

That was not a controlled one-factor proof: two infrastructure roles changed together. The load generator had independently measured mostly idle under load, while the database was saturated. That separate observation supports the database and infrastructure attribution, but it is attribution rather than experimental isolation.

The diagnostic evidence did not implicate the engine changes we had suspected. In that bounded sense, the engine was fine.

This is deliberately not a performance claim. It does not publish the benchmark, generalize the result, or promise how the product performs elsewhere. It closes one engineering incident: the apparent regression came from the measurement environment, not the application path under investigation.

Status lines versus contracts

Every useful finding came from checking a contract:

  • The cluster’s own startup record showed that the services were healthy.
  • The presence of a result file showed whether the benchmark had produced data.
  • Response classification showed whether traffic was successful rather than merely numerous.
  • Database existence and service state showed whether deployment had completed.
  • Component utilization under load showed where the system was actually constrained.
  • The provider specification showed whether observed variation was anomalous or expected.

The misleading findings came from status lines:

  • exit code 0;
  • “Deploy done”;
  • “process still running”;
  • a gate described as enforced;
  • a large result with no success-quality check.

The difference is small in implementation and enormous in consequence. “Did the command say it succeeded?” is not the same question as “Is the postcondition true?”

Documentation did not save us

A month earlier, the same harness had encountered five problems. All five were documented. The harness header said the fixes had been applied so the next run would not repeat them.

Two of the five fixes silently failed to apply. We encountered both problems again.

That recurrence matters because it removes the comforting explanation that the team simply needed a better runbook. The runbook already described the failures. The harness already claimed to encode the fixes. Documentation did not make the behavior fail closed.

We therefore audited the eight failures by mechanism, not intention.

  • One now has a code-level gate. The CPU parity gate requires every role in the dependency path and refuses incomplete or invalid input. Its pass claim is narrow: no supplied node is materially slower than its peers. It does not prove the wider fleet or harness is ready.
  • Seven remain documentation. The mechanisms behind them—suppressed errors, remote-only logs, incomplete postconditions, and scripts that continue after failure—still exist.

The honest status is that one of eight now has a code-level guard, while seven remain documentation-only and can recur. The next work is to turn each documented expectation into an executable postcondition. That work is queued, not done.

Why we are publishing an unfinished fix

Run-True Decision builds a Fraud Decision Engine around a simple trust principle: a decision should be supported by evidence that can be examined.

That principle is only credible if it also applies to our engineering process. “The command said success” is no stronger than “the model said so” when neither statement can show that its underlying condition is true.

Publishing this before all eight failures are fixed is uncomfortable. It is also more useful than waiting for a tidy ending. The important artifact is not a story in which every problem was resolved. It is a record of which assurance is executable, which remains documentary, and which conclusions were withdrawn when the next experiment contradicted them.

Exit code zero is a status. Trust begins with the postcondition.

Engineering takeaway: Choose one green status in your own test, deployment, or operations workflow. What independent evidence proves the condition behind it? If the answer is another status line, the check is not finished. Talk to us if you want to compare approaches.

Part of 100 Days Building RTD in Public.

Related Articles