# `Reach.Evidence.ExternalDataBoundary`
[🔗](https://github.com/elixir-vibe/reach/blob/v2.8.4/lib/reach/evidence/external_data_boundary.ex#L1)

Collects decoded external values crossing storage or process boundaries.

# `environment`

```elixir
@type environment() :: %{
  optional(atom() | {:reach, :state_callback}) =&gt;
    taint() | {atom(), non_neg_integer()}
}
```

# `taint`

```elixir
@type taint() :: [Reach.Evidence.ExternalDataBoundary.Origin.t()]
```

# `collect_project`

```elixir
@spec collect_project(Reach.Project.t()) :: [
  Reach.Evidence.ExternalDataBoundary.Fact.t()
]
```

Collects boundary-crossing evidence from all source files in a project.

# `fixed_contract?`

```elixir
@spec fixed_contract?(Reach.Evidence.ExternalDataBoundary.Fact.t(), pos_integer()) ::
  boolean()
```

Returns whether boundary evidence has enough fixed-key consumers for policy promotion.

# `transport_envelope?`

```elixir
@spec transport_envelope?(Reach.Evidence.ExternalDataBoundary.Fact.t()) :: boolean()
```

Returns whether a fact preserves a sandbox payload or transient wire envelope.

---

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