Coordinated Omission
Purpose
Establish whether a set of latency numbers is missing the samples that would have carried its
tail, and what to do about it. The failure this skill prevents is the SLO signed against a
load test whose p99 was structurally incapable of seeing the queue: the generator stopped
issuing requests exactly while the system was slow, so the worst moments produced one sample
instead of fifty.
The mechanism is precise: the measured system delays or suppresses future observations that the
target arrival process would have generated. The resulting sample is conditioned on the system
being responsive. A 500 ms completed request may still be recorded as 500 ms, while scheduled
arrivals during it are absent, delayed, or timed from their eventual send rather than their due
time. The distortion can therefore affect sample density, offered load, queue state and the clock
used for each value. Counts are necessary evidence, but they do not identify the cause alone.
Workflow
- Establish the generation model explicitly — closed-loop, open-loop, or semi-open.
Whatever it is, it must be a decision, not the tool's default.
- Write the stage and clock model. Count scheduled/offered, generator-admitted, started,
server-accepted and every terminal outcome. Preserve scheduled time, actual start, response
completion and deadline so generator lag and send-to-completion response time are separable.
- Check response coupling. In a closed population at equilibrium, the interactive response
law is
X = N/(R+Z) for population N, response time R and think time Z. It explains why
throughput falls as responses slow; N ≥ λR is a concurrency sizing estimate, not proof that
a finite generator realised an open arrival process.
- Reconcile the schedule. Match due schedule IDs to starts within the same cohort and
observation cutoff, separating retries and future slots. A deficit identifies outstanding
due starts (late, dropped or unresolved); it can come from
response coupling, generator CPU/event-loop lag, connections, admission or an explicit drop
policy. Use timestamps and generator telemetry to distinguish them. See
references/detection-and-generator-configuration.md.
- Re-run with generation-time fidelity when possible. Use the workload model production
requires, validate actual inter-arrivals and generator headroom, and retain drops/timeouts as
terminal outcomes. Report schedule delay separately or include it in the declared end-to-end
clock.
- Use HdrHistogram correction only as a sensitivity model for legacy omission-prone data.
It creates synthetic observations under a regular-interval counterfactual; it does not recover
the requests or queue that never existed. See
references/post-hoc-correction.md.
- Report the evidence packet, including raw and any corrected distributions, all stage
counts, generator resource limits, arrival model, clocks and remaining threats.
Rules
- Do not use universal deficit or
MAX/p99 thresholds. Distribution shape, duration, sample
size and offered load can make any ratio healthy or pathological. Open load can change queue
state and therefore the maximum itself; HdrHistogram quantises recorded values.
- A histogram/sample deficit is not equivalent to scheduled/start deficit: errors, timeouts and
excluded outcomes may never enter a success-latency histogram. Reconcile independent counters.
- Closed-loop is correct for genuinely closed populations and serial workflows. The defect is a
workload-model mismatch or a latency-at-fixed-arrival claim, not closed loops themselves.
- Do not apply expected-interval correction to complete independently arriving observations
or already compensated data. It adds synthetic samples to waits already represented.
Verify actual starts, the recorded clock and any recorder-side sampling before calling data
complete; an open-arrival configuration alone does not prove this. Use plain recording for
those observed values and report losses separately.
- Preserve both
actualStart−scheduledStart and completion−actualStart; use
completion−scheduledStart only when the end-to-end estimand treats generator/client queueing
as user wait. A scheduled item that is dropped is an outcome, not a fabricated latency.
- Preallocate concurrency from measured duration distributions and headroom, then validate actual
schedule adherence.
N≈λR is a mean equilibrium relation, not a worst-case guarantee.
- Any generator—including native code—can suffer scheduler pauses, CPU throttling, socket limits,
clock error or distributed-controller skew. Monitor its host/process and timestamp actual starts.
- Tool behaviour is version- and scenario-specific. Use explicit open/closed constructs and verify
effective output; the maintained tool matrix is in the detection reference.
- HdrHistogram has one correction for at-recording time (
recordValueWithExpectedInterval)
and one for after (copyCorrectedForCoordinatedOmission,
addWhileCorrectingForCoordinatedOmission). Its javadoc calls them mutually exclusive
on the same data: applying both counts the omission twice.
- A global pause is a clear demonstration, but is not required. Any slowdown or capacity loss
can build a queue under exogenous arrivals while a finite closed loop reduces offered load.
A sleep can reproduce the effect when it occupies a bounded worker/resource; state the model.
- Ordinary JMH invocation-cost measurements do not promise an external arrival schedule.
They are not evidence of service latency at a production rate. A benchmark wrapping remote
calls or asynchronous submissions can still omit waits or measure enqueue time only;
inspect its operation/completion boundary before making a latency claim.
- Completed-call-only timers that exclude rejects/timeouts exhibit outcome-selection or censoring,
not necessarily coordinated omission. They create the same optimistic dashboard and require
terminal-outcome denominators, but name the mechanism correctly.
- Many independent closed users can approximate an open aggregate only under conditions on
independence, population and think/service times. Correlated clients, synchronized retries and
admission queues violate that approximation; measure production arrivals.
Required audit artifact
For Java instrumentation, inspect the project's compiler/runtime and resolved HdrHistogram
version before editing. The APIs shown are partial snippets, verified here with HdrHistogram
2.2.2 on JDK 25; no Java baseline is otherwise imposed. Preserve the target toolchain and
dependencies unless a change is authorized. If raw timing or generation evidence is absent,
report the diagnosis as unresolved and identify the trace/counter needed to distinguish causes.
Target workload: open / closed / semi-open / replay; production evidence
Clock model: scheduled, actual start, accepted, completed/deadline timestamps
Stage counts: scheduled → admitted → started → accepted → each terminal outcome
Generator: version/config, VUs/workers, CPU/GC/event-loop, sockets, clock sync
Schedule: target and empirical inter-arrival distributions; lag/drop policy
Results: raw distribution; corrected sensitivity (if any) and its interval model
Threats: response coupling, saturation, censoring, retries, shared bottlenecks
Decision: representative / descriptive-only / rerun required
References
- Detection and generator configuration
— stage reconciliation, timestamp evidence, generator validation, and version-sensitive
semantics for wrk2, k6, Gatling, JMeter and Locust. Read when auditing an existing result set
or configuring a run.
- Post-hoc correction — the
recordValueWithExpectedInterval algorithm with a worked example, HdrHistogram's own
post-hoc API (copyCorrectedForCoordinatedOmission) and the double-correction rule, the
decision table for when closed-loop is legitimately fine, sensitivity reporting,
and where the regular-spacing counterfactual breaks. Read when assessing a proposed
correction or legacy omission-prone data that cannot be re-run.
1---2name: coordinated-omission3description: Coordinated omission in depth: response-coupled sampling, open/closed/semi-open workload models, scheduled-versus-actual clocks, generator saturation, correction at recording time versus at generation time, HdrHistogram's recordValueWithExpectedInterval semantics, what wrk2, k6, Gatling, JMeter and Locust each actually do, and the effect on capacity numbers. Use when a load test's p99 is far better than production's for the same endpoint, when a generator misses its planned schedule, when someone proposes applying recordValueWithExpectedInterval to open-loop data, when a latency dashboard improves as a system saturates, or when a benchmark's numbers are about to become an SLO. Does not cover the introductory treatment or the general statistics of latency (latency-statistics), or designing the load test as a whole (load-testing).4---56# Coordinated Omission78## Purpose910Establish whether a set of latency numbers is missing the samples that would have carried its11tail, and what to do about it. The failure this skill prevents is the SLO signed against a12load test whose p99 was structurally incapable of seeing the queue: the generator stopped13issuing requests exactly while the system was slow, so the worst moments produced one sample14instead of fifty.1516The mechanism is precise: the measured system delays or suppresses future observations that the17target arrival process would have generated. The resulting sample is conditioned on the system18being responsive. A 500 ms completed request may still be recorded as 500 ms, while scheduled19arrivals during it are absent, delayed, or timed from their eventual send rather than their due20time. The distortion can therefore affect sample density, offered load, queue state and the clock21used for each value. Counts are necessary evidence, but they do not identify the cause alone.2223## Workflow24251. **Establish the generation model explicitly** — closed-loop, open-loop, or semi-open.26 Whatever it is, it must be a decision, not the tool's default.272. **Write the stage and clock model.** Count scheduled/offered, generator-admitted, started,28 server-accepted and every terminal outcome. Preserve scheduled time, actual start, response29 completion and deadline so generator lag and send-to-completion response time are separable.303. **Check response coupling.** In a closed population at equilibrium, the interactive response31 law is `X = N/(R+Z)` for population `N`, response time `R` and think time `Z`. It explains why32 throughput falls as responses slow; `N ≥ λR` is a concurrency sizing estimate, not proof that33 a finite generator realised an open arrival process.344. **Reconcile the schedule.** Match due schedule IDs to starts within the same cohort and35 observation cutoff, separating retries and future slots. A deficit identifies outstanding36 due starts (late, dropped or unresolved); it can come from37 response coupling, generator CPU/event-loop lag, connections, admission or an explicit drop38 policy. Use timestamps and generator telemetry to distinguish them. See39 `references/detection-and-generator-configuration.md`.405. **Re-run with generation-time fidelity when possible.** Use the workload model production41 requires, validate actual inter-arrivals and generator headroom, and retain drops/timeouts as42 terminal outcomes. Report schedule delay separately or include it in the declared end-to-end43 clock.446. **Use HdrHistogram correction only as a sensitivity model for legacy omission-prone data.**45 It creates synthetic observations under a regular-interval counterfactual; it does not recover46 the requests or queue that never existed. See `references/post-hoc-correction.md`.477. **Report the evidence packet**, including raw and any corrected distributions, all stage48 counts, generator resource limits, arrival model, clocks and remaining threats.4950## Rules5152- Do not use universal deficit or `MAX/p99` thresholds. Distribution shape, duration, sample53 size and offered load can make any ratio healthy or pathological. Open load can change queue54 state and therefore the maximum itself; HdrHistogram quantises recorded values.55- A histogram/sample deficit is not equivalent to scheduled/start deficit: errors, timeouts and56 excluded outcomes may never enter a success-latency histogram. Reconcile independent counters.57- Closed-loop is correct for genuinely closed populations and serial workflows. The defect is a58 workload-model mismatch or a latency-at-fixed-arrival claim, not closed loops themselves.59- **Do not apply expected-interval correction to complete independently arriving observations60 or already compensated data.** It adds synthetic samples to waits already represented.61 Verify actual starts, the recorded clock and any recorder-side sampling before calling data62 complete; an open-arrival configuration alone does not prove this. Use plain recording for63 those observed values and report losses separately.64- Preserve both `actualStart−scheduledStart` and `completion−actualStart`; use65 `completion−scheduledStart` only when the end-to-end estimand treats generator/client queueing66 as user wait. A scheduled item that is dropped is an outcome, not a fabricated latency.67- Preallocate concurrency from measured duration distributions and headroom, then validate actual68 schedule adherence. `N≈λR` is a mean equilibrium relation, not a worst-case guarantee.69- Any generator—including native code—can suffer scheduler pauses, CPU throttling, socket limits,70 clock error or distributed-controller skew. Monitor its host/process and timestamp actual starts.71- Tool behaviour is version- and scenario-specific. Use explicit open/closed constructs and verify72 effective output; the maintained tool matrix is in the detection reference.73- HdrHistogram has one correction for at-recording time (`recordValueWithExpectedInterval`)74 and one for after (`copyCorrectedForCoordinatedOmission`,75 `addWhileCorrectingForCoordinatedOmission`). Its javadoc calls them mutually exclusive76 on the same data: applying both counts the omission twice.77- A global pause is a clear demonstration, but is not required. Any slowdown or capacity loss78 can build a queue under exogenous arrivals while a finite closed loop reduces offered load.79 A sleep can reproduce the effect when it occupies a bounded worker/resource; state the model.80- Ordinary JMH invocation-cost measurements do not promise an external arrival schedule.81 They are not evidence of service latency at a production rate. A benchmark wrapping remote82 calls or asynchronous submissions can still omit waits or measure enqueue time only;83 inspect its operation/completion boundary before making a latency claim.84- Completed-call-only timers that exclude rejects/timeouts exhibit outcome-selection or censoring,85 not necessarily coordinated omission. They create the same optimistic dashboard and require86 terminal-outcome denominators, but name the mechanism correctly.87- Many independent closed users can approximate an open aggregate only under conditions on88 independence, population and think/service times. Correlated clients, synchronized retries and89 admission queues violate that approximation; measure production arrivals.9091## Required audit artifact9293For Java instrumentation, inspect the project's compiler/runtime and resolved HdrHistogram94version before editing. The APIs shown are partial snippets, verified here with HdrHistogram952.2.2 on JDK 25; no Java baseline is otherwise imposed. Preserve the target toolchain and96dependencies unless a change is authorized. If raw timing or generation evidence is absent,97report the diagnosis as unresolved and identify the trace/counter needed to distinguish causes.9899```text100Target workload: open / closed / semi-open / replay; production evidence101Clock model: scheduled, actual start, accepted, completed/deadline timestamps102Stage counts: scheduled → admitted → started → accepted → each terminal outcome103Generator: version/config, VUs/workers, CPU/GC/event-loop, sockets, clock sync104Schedule: target and empirical inter-arrival distributions; lag/drop policy105Results: raw distribution; corrected sensitivity (if any) and its interval model106Threats: response coupling, saturation, censoring, retries, shared bottlenecks107Decision: representative / descriptive-only / rerun required108```109110## References111112- [Detection and generator configuration](references/detection-and-generator-configuration.md)113 — stage reconciliation, timestamp evidence, generator validation, and version-sensitive114 semantics for wrk2, k6, Gatling, JMeter and Locust. Read when auditing an existing result set115 or configuring a run.116- [Post-hoc correction](references/post-hoc-correction.md) — the117 `recordValueWithExpectedInterval` algorithm with a worked example, HdrHistogram's own118 post-hoc API (`copyCorrectedForCoordinatedOmission`) and the double-correction rule, the119 decision table for when closed-loop is legitimately fine, sensitivity reporting,120 and where the regular-spacing counterfactual breaks. Read when assessing a proposed121 correction or legacy omission-prone data that cannot be re-run.