At a hosted browser provider, sessions from your driving-test booking suite carry no verdict — what are the causes?
answer
- check you are looking in the right place
- skipped, refused, or lost with the process
- a refusal is information only if kept
- a cleanup block is not a promise
- absence is evidence about the reporting path
basics
~20 sA missing verdict takes one of three shapes: the call was skipped before it ran, refused when it arrived, or lost when the process died. That is evidence about your reporting path, not about the test.
solid answer
~50 sStart by ruling out the boring answer — that it was sent and you are reading the wrong account, the wrong name or the wrong window. Then there are three real shapes. **Skipped**: the reporting code never executed, because the case threw somewhere it does not cover, returned early, was filtered out, or ran in a worker that exited first. **Refused**: the call was made and rejected — a credential that differs from the one the session used, a payload the service will not take, or a session it no longer accepts annotations for. **Lost**: the process died between deciding the verdict and sending it, so nothing was recorded in either place. The last is the worst, because a passing run and a killed run leave the same gap. Treat the absence as a fault in your reporting path until your own instrumentation says otherwise.
go deeper
Learn the first move: confirm you are looking at the right account, the right case name and the right time window before blaming anything. A surprising share of missing verdicts are verdicts that arrived somewhere you were not looking.
Be able to name the three shapes and one concrete cause of each. Know that a bare catch around the reporting call destroys the distinction between refused and skipped, which is the distinction you most need.
Expect a scenario. Talk through the diagnosis, then talk about instrumenting your own side so next time the shapes separate themselves: attempts counted, acknowledgements counted, and a reconciliation printed at the end of the run.
Own the policy question. Decide whether a run that cannot report its verdicts is a failed run, say so in writing, and make sure the decision is not being made by accident inside an empty catch block somebody wrote in a hurry.
## First, rule out the dull explanation Before diagnosing your harness, establish that the verdict really is absent. An annotation you sent successfully can still be invisible to you: you are signed in to a different account from the one the pipeline uses, you are filtering on a case name your code normalises differently from the way you typed it, or the window you are looking at does not contain the run. It costs nothing to eliminate, and it is the most common first cause. Once that is out of the way, a missing verdict has three shapes. ## Skipped: the call never ran The reporting code exists and was not reached. Common routes: - the case failed where the reporting path does not cover — in setup, inside a fixture, in a data-loading step that runs before the wrapper that would have reported; - an early return, a guard clause or a branch that quietly skips the report; - the case was filtered out or abandoned after the session had already been created, so a session exists and no outcome was ever computed for it; - a parallel worker exited while holding cases whose reporting had not happened yet; - the annotation sits behind a flag that is on locally and off in this pipeline. What you observe is a session with no outcome attached, which reads as an unfinished run — and that reading is usually wrong: the test finished perfectly well and the report did not. ## Refused: the call ran and was rejected Your code did its job and the far side said no. The plausible causes all follow from this being a **different call on a different channel** from the one that drove the browser: - it authenticates with a credential that is not the one the session used, or one rotated between the pipeline reading its secret and the call being made; - the payload is not acceptable — a field too long, a name carrying characters the service will not store, a verdict value it does not recognise; - it names a session the service will no longer accept an annotation for; - the account is being throttled because a wide run fired its annotations in a burst. The important operational point: **a refusal is information, and it is only yours if you kept it.** A reporting call wrapped in a bare catch that logs nothing turns a refusal into the same silence as a skip, and you have thrown away the one distinguishing signal you had. ## Lost: the process died holding the verdict The verdict was decided and the process stopped before it left: a cancelled job, a runner reclaimed mid-run, a hard kill on a timeout, an out-of-memory death. This is the worst of the three because **it is the shape in which a case that passed leaves the same trace as one that never ran.** The other two usually leave something on your side — a log line, a stack, an exit code. A killed process takes both records at once. A variant catches experienced people: the verdict is sent from a cleanup block, and that block is not a guarantee. It runs while an exception unwinds the stack; it does not run when the process is terminated from outside, when the runtime is halted directly, or when the thread is still blocked in a call that never returns. ## What the absence actually tells you | You observe | You may conclude | You must establish separately | |---|---|---| | session present, no verdict | your reporting path did not complete | whether the case passed | | verdict present, disagrees with your report | the two were written at different moments | which one is later | | no session at all | no session was created under this account | whether the case ran elsewhere | The discipline worth taking away: **a missing verdict is evidence about the reporting path, not about the test.** Reading it as a failure is as wrong as reading it as a pass. ## Making the three distinguishable Instrument your own side so the shapes separate without guesswork: 1. **Count attempts and acknowledgements separately.** Skipped then shows as no attempt, refused as an attempt with no acknowledgement. 2. **Reconcile at the end of the run.** Compare the cases executed against the annotations acknowledged and print the difference, so a run that under-reports says so out loud. 3. **Log every refusal at warning level with the case name and the reason** — never at debug, never swallowed. Cheapest change, largest diagnostic payoff. 4. **Write the verdict locally first, then push it.** A killed process then loses the push rather than the fact. 5. **Do not retry without a bound**, or a provider-side wobble becomes a suite that runs far longer than it should and still reports nothing. ## And the judgement call Decide deliberately whether a suite should fail when annotations go missing. Failing makes the reporting path a first-class dependency of every run — honest, occasionally infuriating. Not failing keeps runs green and relies on someone reading the reconciliation line. Either is defensible; drifting into the second because a catch block was empty is not.
- Which of the three is hardest to detect, and why?Loss to a killed process. A skip usually leaves a code path you can find and a log that stops abruptly; a refusal leaves a response you can log. A hard kill removes the harness's own record at the same moment, so a case that passed and a case that never started look identical from both sides. Writing the verdict locally before sending it remotely narrows the window.
- Should a failed annotation fail the test run?It is a policy decision, not a technical one, and it should be made on purpose. Failing makes the reporting path a hard dependency and surfaces problems immediately. Not failing keeps runs green but relies on someone reading the reconciliation output. What is indefensible is arriving at the second by accident because the reporting call was wrapped in an empty catch.
- Your suite reports verdicts reliably in one pipeline and not in another. Where do you look first?At the differences between the two environments rather than at the harness: which credential each reads, whether the annotation is behind a flag or profile that only one enables, whether one cancels jobs aggressively on timeout, and whether one runs far wider than the other and is being throttled at the end of each case. The code is the same; the surroundings are not.
saying these in an interview costs you the question
- Reading a missing verdict as a failed test
- Wrapping the reporting call in a catch block that logs nothing
- Assuming a cleanup block always runs, whatever kills the process
- Retrying a refused annotation without any bound
- Trusting the remote record over the harness's own for the verdict
- Never reconciling cases executed against annotations acknowledged