# `ASM.Execution.Config`
[🔗](https://github.com/nshkrdotcom/agent_session_manager/blob/v0.9.2/lib/asm/execution/config.ex#L1)

Normalized execution-mode, execution-surface, and execution-environment
configuration with precedence-aware merging.

In Wave 1 this module is also the explicit carrier boundary between the ASM
kernel and the frozen lower contract packet:

- `BoundarySessionDescriptor.v1`
- `AttachGrant.v1`
- `ExecutionEvent.v1`
- `ExecutionOutcome.v1`
- `ProcessExecutionIntent.v1`
- `JsonRpcExecutionIntent.v1`

`execution_surface` and `execution_environment` remain the family-facing
mapped carrier IR here. The detailed lower intent interiors stay provisional
until Wave 3 prove-out.

# `remote_t`

```elixir
@type remote_t() :: %{
  remote_node: atom(),
  remote_cookie: atom() | nil,
  remote_connect_timeout_ms: pos_integer(),
  remote_rpc_timeout_ms: pos_integer(),
  remote_boot_lease_timeout_ms: pos_integer(),
  remote_bootstrap_mode: :require_prestarted | :ensure_started,
  remote_cwd: String.t() | nil
}
```

# `t`

```elixir
@type t() :: %ASM.Execution.Config{
  execution_environment: ASM.Execution.Environment.t(),
  execution_mode: :local | :remote_node,
  execution_surface: CliSubprocessCore.ExecutionSurface.t(),
  provider_permission_mode: atom() | nil,
  remote: remote_t() | nil,
  transport_call_timeout_ms: pos_integer()
}
```

# `execution_plane_contracts`

```elixir
@spec execution_plane_contracts() :: [String.t(), ...]
```

# `provisional_minimal_lane_contracts`

```elixir
@spec provisional_minimal_lane_contracts() :: [String.t(), ...]
```

# `resolve`

```elixir
@spec resolve(keyword(), keyword(), keyword()) :: {:ok, t()} | {:error, ASM.Error.t()}
```

# `to_execution_environment`

```elixir
@spec to_execution_environment(t()) :: ASM.Execution.Environment.t()
```

# `to_execution_surface`

```elixir
@spec to_execution_surface(t()) :: CliSubprocessCore.ExecutionSurface.t()
```

---

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