# `Raxol.AgentClientProtocol.Ext.Schema.SteerResponse`
[🔗](https://github.com/DROOdotFOO/raxol-agent/blob/raxol_agent_client_protocol-v0.1.0/packages/raxol_agent_client_protocol/lib/raxol/agent_client_protocol/ext/schema.ex#L286)

`_raxol/session.steer` response: the synchronous, honest CAS
outcome — the full vocabulary a Surface banner renders.

`steer/2` is deliberately a SYNCHRONOUS typed decision, not fire-and-forget:
a stale-turn (or reuse, or no-live-turn) rejection is NON-journaled (zero model
effect), so no event a surface could observe ever carries the outcome — only a
direct reply can honestly distinguish "accepted" from "silently dropped".

The wire `"outcome"` discriminator is one of:

  * `"accepted"`  — landed in the running turn; carries the accept `ref`
    (`turnId`/`offset`/`clientMsgId`).
  * `"duplicate"` — the same `clientMsgId` was already accepted; `ref`
    references the ORIGINAL accept (mobile-retry idempotency).
  * `"stale"`     — the CAS lost (turn ended, or another steer won);
    carries `expectedTurnId`/`actualTurnId`. Nothing journaled.
  * `"no_live_turn"`      — no turn is currently running.
  * `"client_msg_id_reuse"` — the same idempotency key arrived with different
    content (a client bug/attack, never a retry).
  * `"no_steer_channel"`  — the session has no steer adapter wired (the honest
    refusal).

# `t`

```elixir
@type t() :: %Raxol.AgentClientProtocol.Ext.Schema.SteerResponse{
  result: Raxol.AgentClientProtocol.Session.SteerAdapter.result()
}
```

# `from_json`

```elixir
@spec from_json(map()) :: {:ok, t()} | {:error, term()}
```

# `new`

```elixir
@spec new(Raxol.AgentClientProtocol.Session.SteerAdapter.result()) :: t()
```

Wrap a CAS `result` (as returned by a `SteerAdapter.resolve/2`) for the wire.

# `result`

```elixir
@spec result(t()) :: Raxol.AgentClientProtocol.Session.SteerAdapter.result()
```

The wrapped CAS result (the honest outcome vocabulary).

# `to_json`

```elixir
@spec to_json(t()) :: map()
```

---

*Consult [api-reference.md](api-reference.md) for complete listing*
