# `Selecto.Capabilities.Decision`

Stable capability answer shape.

Decisions are richer than booleans so consumers can represent hidden,
disabled, preview-only, and query-shaping outcomes consistently.

# `status`

```elixir
@type status() :: :allow | :deny | :conditional | :not_applicable
```

# `t`

```elixir
@type t() :: %Selecto.Capabilities.Decision{
  audit_reason: String.t() | nil,
  effects: [term()],
  metadata: map(),
  obligations: [term()],
  reason_code: atom() | String.t() | nil,
  status: status(),
  user_message: String.t() | nil,
  visibility: visibility()
}
```

# `visibility`

```elixir
@type visibility() :: :enabled | :disabled | :hidden | :preview_only
```

# `allow`

```elixir
@spec allow(atom() | String.t(), map() | keyword()) :: t()
```

Builds an allow decision.

# `deny`

```elixir
@spec deny(atom() | String.t(), map() | keyword()) :: t()
```

Builds a deny decision.

# `hidden`

```elixir
@spec hidden(atom() | String.t(), map() | keyword()) :: t()
```

Builds a hidden deny decision.

# `new`

```elixir
@spec new(map() | keyword()) :: t()
```

Builds a decision from atom-keyed or string-keyed map/keyword attributes.

# `not_applicable`

```elixir
@spec not_applicable(atom() | String.t(), map() | keyword()) :: t()
```

Builds a not-applicable decision.

# `preview_only`

```elixir
@spec preview_only(atom() | String.t(), map() | keyword()) :: t()
```

Builds a conditional preview-only decision.

---

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