# `Nous.Sandbox.Confined`
[🔗](https://github.com/nyo16/nous/blob/v0.17.1/lib/nous/sandbox/confined.ex#L34)

The result of `Nous.Sandbox.confine/2`: an argv to spawn plus the data needed
to interpret what comes back.

Enforcement is *data*, not behaviour. A provider states which mechanism it
wrapped the argv with and which output patterns mean "denied" or "the runner
broke"; `Nous.Sandbox.classify/3` is a pure function over that data. This is
what keeps a cross-backend signature from matching: a bwrap-confined command
carries only bwrap's signatures, so Seatbelt's "operation not permitted"
never applies to it.

# `enforcement`

```elixir
@type enforcement() :: :sandbox_exec | :bwrap | :none
```

The mechanism that wrapped the argv. `:none` means the argv was passed
through unconfined (`:danger_full_access` only).

# `t`

```elixir
@type t() :: %Nous.Sandbox.Confined{
  argv: [String.t()],
  denial_signatures: [String.t()],
  enforcement: enforcement(),
  mode: Nous.Sandbox.Policy.mode(),
  runner_failure_rules: [Nous.Sandbox.RunnerFailureRule.t()]
}
```

---

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