---
url: >-
  https://adk.nht.io/api/@nhtio/adk/shims/variables/E_SHIM_RESOLVER_ALREADY_RESOLVED.md
description: >-
  Thrown by [`registerAdkResolver`](https://adk.nht.io/api/@nhtio/adk/shims/functions/registerAdkResolver) when it is called again after the
  ambient [`adk`](https://adk.nht.io/api/@nhtio/adk/shims/variables/adk) shim has already resolved once successfully.
---

# Variable: E\_SHIM\_RESOLVER\_ALREADY\_RESOLVED

```ts
const E_SHIM_RESOLVER_ALREADY_RESOLVED: CreatedException<[]>;
```

Defined in: [src/shims/index.ts:227](https://github.com/NHTIO/ADK/blob/v1.20260713.1/src/src/shims/index.ts#L227)

Thrown by [registerAdkResolver](../functions/registerAdkResolver.md) when it is called again after the ambient [adk](adk.md) shim
has already resolved once successfully.

## Remarks

This is a split-brain guard, not a general "can't change your mind" restriction: re-registering
a resolver **before** the first successful resolution silently overwrites the previous
registration (last writer wins, no throw) — that path is expected during application bootstrap,
where a resolver might be registered speculatively and then replaced before anything ever reads
`adk`. Once a real bundle has been handed out through the ambient shim, though, swapping the
resolver underneath already-resolved consumers risks two different call sites silently observing
two different ADK builds through the same shared `adk` handle — a bug that is far harder to
diagnose than a loud, immediate throw at the mis-timed `registerAdkResolver` call site. If you
need a second, independently swappable binding, construct a fresh [createAdkShim](../functions/createAdkShim.md) instance
instead of trying to repoint the ambient one.
