---
url: >-
  https://adk.nht.io/api/@nhtio/adk/batteries/validation/functions/orderingGuardDispatchMiddleware.md
---

# Function: orderingGuardDispatchMiddleware()

```ts
function orderingGuardDispatchMiddleware(
  options: OrderingGuardOptions,
): DispatchPipelineMiddlewareFn;
```

Defined in: [src/batteries/validation/middleware.ts:410](https://github.com/NHTIO/ADK/blob/v1.20260824.1/src/src/batteries/validation/middleware.ts#L410)

Builds a [@nhtio/adk!DispatchPipelineMiddlewareFn](../../../dispatch_runner/type-aliases/DispatchPipelineMiddlewareFn.md) that validates (and, in `'mutate'`
mode, best-effort repairs) turn-state primitive ordering against `options.profiles` before
every executor call.

## Parameters

| Parameter | Type                                                                  | Description                                                                                                                                                           |
| --------- | --------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `options` | [`OrderingGuardOptions`](../types/interfaces/OrderingGuardOptions.md) | Validated via [validateOptions](../validation/functions/validateOptions.md) at call time; throws `E_INVALID_ORDERING_GUARD_OPTIONS` synchronously on malformed input. |

## Returns

[`DispatchPipelineMiddlewareFn`](../../../dispatch_runner/type-aliases/DispatchPipelineMiddlewareFn.md)

A middleware function following the `(ctx, next) => void | Promise<void>` idiom —
nacks via `ctx.nack(error)` (or throws, per `options.onViolation`) without calling `next()`
on an unrepaired blocking violation.

## Remarks

Runs on every `dispatchInputPipeline` iteration, since that is the point where a caught
ordering bug is cheapest to fix — before the wire payload is ever built. See the plan's
"Middleware — `dispatchInputPipeline`/`turnInputPipeline` integration" section for why this
insertion point was chosen over a one-shot turn-level check alone.
