Technical Excellence

Not Run Is
Not Passing

Part VI · Excellence Across the Nine Phases 04 · Test

On 30 August I pointed a ten-minute load test at a banking demo I had built to walk the whole lifecycle. The target was ten transfers a second. The transfer endpoint answered at a p95 of 29.88 milliseconds against a budget of 500. All 5,986 transfers went through. The results log still records that run as partial.

Fifteen scheduled iterations never started. The gate that catches that is the strictest one in the file: dropped iterations must equal zero, because if the tool cannot inject ten requests a second, none of the other numbers describe ten a second. Every latency figure in that report was true, and the run had still not proven what it set out to prove.

// the crux

A partial with its reason written down is worth more than a pass you rounded up.

// in one breath
  • A load run that beat its latency budget seventeen times over and still did not earn the word pass.
  • Four words for every result, and the one nobody wants to write, because it comes with work attached.
  • Why the instruments get checked before anyone is allowed to say done.
the vocabulary

Four Words, and Green Is Not One of Them

The standards that project runs on, which I wrote up with an AI assistant, give every suite, run and deliverable exactly one of four words, and nothing else is accepted in a results log or a handover. They are short on purpose. Each one tells the next person what to do.

The four verdicts, and nothing else in a results log
VerdictWhat it meansWhat it asks of you
passThe run met every threshold, and the log exists.Keep the log next to the claim.
partialThe run happened, at least one threshold failed, and the failing gate and a hypothesis are written down.Run the experiment the hypothesis names.
not runThe script or spec exists and was never executed.Run it, or say plainly that nobody has.
not doneThe deliverable was never produced.Build it, or list it as backlog with the reason.

It is the courtesy a good review comment pays when it says whether it blocks: one word that tells the reader what to do next. What the list leaves out matters as much as what it holds. There is no green on it, no looks good, no should work. Those words describe a feeling about a system. The four verdicts describe what happened to it.

The lifecycle guide on this site names a passing suite as the deliverable of the Test phase. This vocabulary is what keeps that word honest.

the word nobody writes

Not Run Is the Word Nobody Wants to Write

The same project carries a quieter admission. It has five Playwright specs, one for each user journey: registration, sign-in, balance, beneficiaries and transfers. The runbook's expected column says all five pass. None of them has been run yet, and the project's own README says exactly that, next to the capacity, spike and soak scripts that are in the same state: written, not run.

That is the word teams avoid, and the reason is practical rather than moral. Writing it is a promise of work. Leaving the row blank, or letting a suite nobody executed sit beside a green build, costs nothing today. Nothing failed, so nothing looks wrong, and a reader fills the silence with the most flattering reading available.

A test that was never executed has no result yet. Reporting it as passing borrows a result it has not earned, the same survivorship trap behind the planes that didn't come back, moved into a test report.

before anyone says done

Check the Instruments Before the Verdict

A verdict is only as honest as the instruments behind it, and instruments are wrong in both directions. In the same build, a container reported itself unhealthy while the service answered perfectly from the host: the healthcheck asked for localhost, which resolved to the IPv6 address inside the container, and the server was listening on IPv4 only. A false red, fixed with one address, 127.0.0.1. The failures that go the other way are quieter, which is why the project's definition of done checks the instruments before anyone is allowed to say the word.

  1. 01
    Every container healthcheck passes, at the right address.
    A service that is up and reported down, or down and never asked. What a health check should exercise beyond that, the path a user actually pays for, is the argument of Good Swimmers Drown Quietly.
  2. 02
    A freshly registered user can load every first screen.
    The empty-state path, the one a seeded test account with a full history never walks.
  3. 03
    The status codes the tests assert are the ones in the contract.
    Tests and API that agree with each other and disagree with the contract. The contract settles it, and then the test gets fixed, not the API.

Two more checks on the same list are about dashboards, and they belong to the Monitor phase: why a failure ratio has to read zero rather than no data is the closing argument of Every Error Has an Address. Every check on that list has broken a real build, which is the only reason it is there. A green summary hides all of them, because the summary is assembled from the same instruments that are wrong.

the most useful word

Partial Is the Most Useful Word on the List

Back to the run on 30 August. The shape of that failure was specific. Almost every request finished in tens of milliseconds, and one stalled for 5.87 seconds. Saturation would have slowed everything together; this was one stall. The project's performance notes name the suspects in order: a cold JVM with its connection pool still filling in the opening seconds, then a garbage-collection pause, then a database checkpoint. They also name the experiment that would tell them apart.

// the row, as logged
Run
30 August 2026, ten transfers a second for ten minutes
Numbers
9.88 iterations a second · p95 29.88 ms · 0.14 percent errors
Verdict
partial
Why
15 dropped iterations breached a gate that allows none
Next step
Run it again with a warm-up stage, and line up the drops against the garbage-collection and database dashboards

A pass would have ended the conversation there. Partial kept it open, with a hypothesis attached and a cheap experiment to settle it. That second run has not happened yet, and the log says so. Anyone who reads that row later knows exactly how far to trust it.

// take this to your next results log
  1. Give every row one of four words: pass, partial, not run, not done.
  2. Attach the log to every pass, and the failing gate plus a hypothesis to every partial.
  3. Write not run the moment a suite exists and has not been executed, even when the row is embarrassing.
  4. Before anyone says done, check the instruments: the healthcheck's address, the empty first screen, the contract's status codes.
// the part worth keeping

Report the run you did, not the run you meant to do.

It would have been easy to write pass on that August run. Every number that usually gets quoted was excellent, and the one that failed was a counter of fifteen. Writing partial cost a sentence and a follow-up. It bought a results log I can hand to someone else without an asterisk I would have to explain out loud.
// carry forward

A verdict says whether a run happened and what it proved. The other piece planned for this phase takes on the number teams round up most often, test coverage, along with the flaky tests and brittle selectors that quietly stop a green suite from meaning safe.

// continue exploring